Python pytz:将本地时间转换为 UTC。本地化似乎没有转换

Posted

技术标签:

【中文标题】Python pytz:将本地时间转换为 UTC。本地化似乎没有转换【英文标题】:Python pytz: convert local time to utc. Localize doesn't seem to convert 【发布时间】:2012-11-01 00:12:23 【问题描述】:

我有一个将日期时间存储为 UTC 的数据库。我需要查找特定时间的信息,但日期和时间是以当地时间给出的,比如说“欧洲/哥本哈根”。我得到了这些:

year = 2012; month = 12; day = 2; hour = 13; min = 1;

所以,我需要将这些转换为 UTC,以便我可以在数据库中查找它们。我想使用pytz 来做到这一点。我在看localize

 local_tz = timezone('Europe/Copenhagen')
 t = local_tz.localize(datetime.datetime(year, month, day, hour, min))

但我对localize() 感到困惑。这是假设年份等是在当地时间给我的吗?或者,是否假设它们是以 UTC 给出的,现在它已将它们转换为本地时间?

print t 给我:

2012-12-02 13:01:00+01:00

所以它似乎假设原来的年份等是UTC;小时数现在是 13+1 而不是 13。那么我应该怎么做呢?我已经阅读了 pytz 文档,但这并没有让我更清楚。它提到了很多事情很棘手,所以我不确定 pytz 是否真的在解决这些问题。而且,我并不总是知道这些示例是否向我展示了有效的东西或无效的东西。

我尝试过标准化:

print local_tz.normalize(t)

这给了我与 print t 相同的结果。

编辑:根据上面给出的年份等数字,它应该与数据库中 2012-12-2 12:01 的信息相匹配。 (因为哥本哈根在那个日期是 utc+1)

【问题讨论】:

【参考方案1】:

localize() 将时区附加到 本地 时区中的幼稚 datetime.datetime 实例。

如果您有本地时区的日期时间值,请本地化到该时区,然后使用 .astimezone() 将值转换为 UTC:

>>> localdt = local_tz.localize(datetime.datetime(year, month, day, hour, min))
>>> localdt.astimezone(pytz.UTC)
datetime.datetime(2012, 12, 2, 12, 1, tzinfo=<UTC>)

请注意,您不需要这样做,datetime 对象与时区 可以比较;它们都将被标准化为 UTC 以进行测试:

>>> localdt.astimezone(pytz.UTC) == localdt
True

【讨论】:

表示小时为 14:01:00+01:00。正确的当地时间是 13,UTC 时间是 12。 @user984003:啊,抱歉,第一句话看错了。 .astimezone() 仍然是要走的路,正好相反。 是的,第二种方法有效,谢谢。你能不能把它写在你的答案中,否则我认为这有点令人困惑;)我看到我对打印的日期感到困惑。 “+01:00”告诉我它比世界标准时间早一小时,而不是我应该在时间上增加一小时。 @user984003:已更新,并附有关于datetime.datetime 的时区感知实例比较的说明。 谢谢。是的,现在这是回答我问题的第一个答案。【参考方案2】:

如果您知道传入的时间表示在 Europe/Copenhagen 时区,您可以将其创建为时区感知开始:

local_tz = timezone('Europe/Copenhagen')
t = local_tz.localize(datetime.datetime(year, month, day, hour, min))

然后您可以将其“转换”为UTC

t_utc = t.astimezone(pytz.UTC)

但这可能不是必需的,这取决于您的数据库驱动程序的健全程度。 tt_utc 代表相同的时间点,行为良好的代码应该互换处理它们。 (year, month, day, hour, minute, second, …) 元组只是特定时区和日历系统中此时间点的人类可读表示。

【讨论】:

以上是关于Python pytz:将本地时间转换为 UTC。本地化似乎没有转换的主要内容,如果未能解决你的问题,请参考以下文章

使用 pytz 将 UTC 转换为其他地方的本地时间

Python将字符串转换为本地日期时间到UTC日期时间

Python pytz 时区转换返回的值与不同日期的时区偏移量不同

将本地时间转换为 UTC 时间(日期时间对象)

Django将本地时间转换为UTC时间

Pytz 在没有 DST 的情况下将时间转换为 UTC