首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >和tzinfo对象(更改分钟而不是小时)

和tzinfo对象(更改分钟而不是小时)
EN

Stack Overflow用户
提问于 2016-11-22 11:10:47
回答 5查看 5K关注 0票数 8

我正在尝试将tzinfo应用于datetime对象。

代码语言:javascript
复制
In [1]: from datetime import datetime
In [2]: import pytz

In [3]: london = pytz.timezone("Europe/London")
In [4]: london
Out[5]: <DstTzInfo 'Europe/London' LMT-1 day, 23:59:00 STD>

In [6]: localized_date_object = datetime(2016, 1, 1, 11, 30, 0, 5000, london)
In [7]: localized_date_object
Out[8]: datetime.datetime(2016, 1, 1, 11, 30, 0, 5000, tzinfo=<DstTzInfo 'Europe/London' LMT-1 day, 23:59:00 STD>)

In [9]: utc_date_object = localized_date_object.astimezone(pytz.utc)
In [10]: utc_date_object
Out[11]: datetime.datetime(2016, 1, 1, 11, 31, 0, 5000, tzinfo=<UTC>)

In [16]: paris = pytz.timezone("Europe/Paris")
In [17]: localized_date_object = datetime(2016, 1, 1, 11, 30, 0, 5000, paris)
In [18]: utc_date_object = localized_date_object.astimezone(pytz.utc)
In [19]: utc_date_object
Out[19]: datetime.datetime(2016, 1, 1, 11, 21, 0, 5000, tzinfo=<UTC>)

正如您所看到的,它将增量应用于分钟而不是小时。

有人能解释我在这里做错了什么吗。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-11-22 11:57:55

我认为你应该在巴黎时间使用CET,伦敦时间使用UTC。我使用的方法有点不同,但它对我有用:

代码语言:javascript
复制
from datetime import datetime
from pytz import timezone

ldo = datetime(2016, 1, 1, 11, 30, 0, 5000)
ldo = ldo.replace(tzinfo=timezone('Europe/London'))

udo = ldo.astimezone(timezone('UTC'))
print ldo
print udo

ldo = datetime(2016, 1, 1, 11, 30, 0, 5000)
ldo = ldo.replace(tzinfo=timezone('CET'))

udo = ldo.astimezone(timezone('UTC'))
print ldo
print udo

更新:

当您存储时间值时,还应该存储相关的时区信息。海事组织的最佳做法是将所有内容存储在UTC中,并转换为“用户”时区。顺便说一句,从UTC到欧洲/巴黎的转换工作得完美无缺,请尝试如下:

代码语言:javascript
复制
winter = datetime(2016, 1, 1, 11, 30, 0, 5000, tzinfo=timezone("UTC"))
paris =  winter.astimezone(timezone("Europe/Paris"))
print paris
# 2016-01-01 12:30:00.005000+01:00

summer = datetime(2016, 6, 1, 11, 30, 0, 5000, tzinfo=timezone("UTC"))
paris = summer.astimezone(timezone("Europe/Paris"))
print paris
# 2016-06-01 13:30:00.005000+02:00
票数 2
EN

Stack Overflow用户

发布于 2019-08-16 14:19:26

比兹医生说:

此库只支持两种构建本地化时间的方法。第一种方法是使用pytz库提供的localize()方法。这用于本地化天真的日期时间(没有时区信息的日期时间): 构建本地化时间的第二种方法是使用标准的astimezone()方法转换现有的本地化时间: 不幸的是,在许多时区中使用标准日期时间构造函数的tzinfo参数“不工作”。

在代码示例中,您尝试使用tzinfo参数而不是localize()

代码语言:javascript
复制
>>> london = pytz.timezone("Europe/London")

>>> datetime.datetime(2016, 1, 1, 11, 30, 0, 5000, london) # This is incorrect
datetime.datetime(2016, 1, 1, 11, 30, 0, 5000, tzinfo=<DstTzInfo 'Europe/London' LMT-1 day, 23:59:00 STD>)

>>> london.localize(datetime.datetime(2016, 1, 1, 11, 30, 0, 5000)) # This is correct
datetime.datetime(2016, 1, 1, 11, 30, 0, 5000, tzinfo=<DstTzInfo 'Europe/London' GMT0:00:00 STD>)
票数 10
EN

Stack Overflow用户

发布于 2016-11-22 11:31:09

在第5行中,它显示了一个奇怪的输出-- <DstTzInfo 'Europe/London' LMT-1 day, 23:59:00 STD>,它似乎是一分钟的轮班(-1天+ 23:59:00小时)。

我建议您尝试使用pytz中的其他一些时区定义来查看它们的声明。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40740316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档