我从当地时间到 UTC 的转换有啥问题
Posted
技术标签:
【中文标题】我从当地时间到 UTC 的转换有啥问题【英文标题】:What is wrong with my conversion from local time to UTC我从当地时间到 UTC 的转换有什么问题 【发布时间】:2015-10-30 03:04:56 【问题描述】:根据 timeanddate.com,目前芝加哥比 UTC 晚 5 小时。然而,我的 Python 应用却有不同的想法:
import datetime
import pytz
local_tz = pytz.timezone('America/Chicago')
local_time = datetime.datetime(2015, 8, 6, 0, 0, tzinfo=local_tz)
utc_time = local_time.astimezone(pytz.utc)
print(local_time)
print(utc_time)
2015-08-06 00:00:00-05:51
2015-08-06 05:51:00+00:00
“美国/芝加哥”和“美国/中部”的结果相同。为什么偏移量是 -05:51 而不是 -05:00?
【问题讨论】:
我不确定 :51 的来源,但芝加哥目前在 CDT,而不是 CST。 CST 为 -6:00。 您使用的是什么版本的 pytz? (你可以用 import pytz, pytz.VERSION 检查) @Bacon 我的版本是 2015.4。 @AShelly 时区多年来一直在变化,我相信默认情况下pytz
返回该位置的最早历史时区规则。
【参考方案1】:
pytz
时区对象需要在使用之前使用特定时间进行初始化,并且使用tzinfo=
参数创建datetime
不允许这样做。您必须使用pytz
对象的localize
方法将时区添加到datetime
。
>>> local_tz = pytz.timezone('America/Chicago')
>>> local_time = local_tz.localize(datetime.datetime(2015, 8, 6, 0, 0))
>>> print local_time
2015-08-06 00:00:00-05:00
>>> utc_time = local_time.astimezone(pytz.utc)
>>> print utc_time
2015-08-06 05:00:00+00:00
【讨论】:
是的,它适用于本地化。但是,这 tzinfo= 的事情非常令人困惑!它允许像这样的细微错误。我们需要 datetime.datetime 构造函数中的 tzinfo 参数做什么? @AlexC 我相信datetime
类的作者打算让tzinfo
以不同的方式工作 - 它应该基于传递给其方法的datetime
提供不同的偏移量.这有一个致命的缺陷,即当同一小时出现两次时,它无法处理 DST 结束时的重叠。还有其他tzinfo
实现,例如dateutil
,可以按预期工作,当然除了不可避免的缺陷。
有道理。非常感谢!
我认为唯一可以安全使用 tzinfo= 的情况是:tzinfo=pytz.utc。对吗?
@AlexC 正确,utc
是安全的,因为它是不变的 - 它没有历史记录,也不支持 DST。以上是关于我从当地时间到 UTC 的转换有啥问题的主要内容,如果未能解决你的问题,请参考以下文章