我从当地时间到 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 的转换有啥问题的主要内容,如果未能解决你的问题,请参考以下文章

Js 怎么把UTC时间到转换到当地时间

将某人的当地时间转换为 UTC 时间

python utc和当地时间之间的日期时间转换

在 C/C++ 中在当地时间和 GMT/UTC 之间转换

将当地时间转换为UTC时间

JSON.NET 将 +00:00 时区解析为当地时间,但 Z 解析为 UTC