Python:如何将带时区信息的时间戳转换为UTC,而不知道是否使用了夏令时?

22

我正在尝试将一个始终以太平洋时间表示的时间戳转换为协调世界时 (UTC)。在下面的代码中,我能够指定我拥有的时间戳是以太平洋时间,但它似乎不知道应该是相对于协调世界时的-7小时的偏移量,因为现在只是10月21日,夏令时还没有结束。

脚本:

import pytz
import datetime
naive_date = datetime.datetime.strptime("2013-10-21 08:44:08", "%Y-%m-%d %H:%M:%S")
localtz = pytz.timezone('America/Los_Angeles')
date_aware_la = naive_date.replace(tzinfo=localtz)
print date_aware_la

输出:

    2013-10-21 08:44:08-08:00

直到 DST 在11月3日结束前,它应该有一个偏移量为 -07:00。当 DST 生效和不生效时,如何让我的时区感知日期具有正确的偏移量?pytz 是否聪明到足以知道 DST 将在11月3日生效?

总体目标:我只是想将时间戳转换为 UTC,因为我会得到一个太平洋时间戳,没有任何指示 DST 是否生效。 我不是从 Python 本身生成此日期,因此无法使用 utc_now()。

1个回答

26

使用localize方法:

import pytz
import datetime
naive_date = datetime.datetime.strptime("2013-10-21 08:44:08", "%Y-%m-%d %H:%M:%S")
localtz = pytz.timezone('America/Los_Angeles')
date_aware_la = localtz.localize(naive_date)
print(date_aware_la)   # 2013-10-21 08:44:08-07:00

这在pytz文档的"例子与用法"一节中有详细介绍。

然后继续到UTC:

utc_date = date_aware_la.astimezone(pytz.utc)
print(utc_date)

4
如果要断言naive_date是明确存在的,你可以将 is_dst=None 传递给 localize() 方法;否则可能会静默选择错误的时间。 - jfs
问题是关于时区感知的日期时间。 - Anthony
@Anthony - 其实并不是这样的。标题有些令人困惑,因为它询问如何修复一个错误的时间,但实际上问题和解决方案是在第一次正确创建它。我们有时称之为“XY问题”(https://meta.stackexchange.com/a/66378/201534)。 (问题标题涉及Y,但问题正文表明问题实际上是X。) - Matt Johnson-Pint
哇!也许最好根据情况更正标题? - Anthony
@FranciscoEstêvão - 这些天最好使用内置的zoneinfo,而不是pytz。 :) - undefined
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接