Seb*_*che 5 python datetime pytz
我正在尝试将 tzinfo 应用于日期时间对象。
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>)
Run Code Online (Sandbox Code Playgroud)
如您所见,它将增量应用于分钟而不是小时。
有人可以解释我在这里做错了什么。
小智 7
pytz 文档说:
该库仅支持两种构建本地化时间的方式。首先是使用pytz库提供的localize()方法。这用于本地化一个简单的日期时间(没有时区信息的日期时间):
构建本地化时间的第二种方法是使用标准 astimezone() 方法转换现有的本地化时间:
不幸的是,对于许多时区,使用标准日期时间构造函数的 tzinfo 参数“不起作用”与 pytz。
在提供的代码示例中,您尝试使用tzinfo参数而不是localize()
>>> 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>)
Run Code Online (Sandbox Code Playgroud)
我认为巴黎时间应该使用 CET,伦敦时间应该使用 UTC。我使用的方法有点不同,但它对我有用:
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
Run Code Online (Sandbox Code Playgroud)
更新:
当您存储时间值时,还应该存储相关的时区信息。IMO 最佳实践是将所有内容存储在 UTC 中并转换为“用户”时区以供查看。顺便说一句,从 UTC 转换为欧洲/巴黎可以完美地工作,试试这个:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3133 次 |
| 最近记录: |