Python:如何在不知道 DST 是不是生效的情况下将时区感知时间戳转换为 UTC

Posted

技术标签:

【中文标题】Python:如何在不知道 DST 是不是生效的情况下将时区感知时间戳转换为 UTC【英文标题】:Python: How to convert a timezone aware timestamp to UTC without knowing if DST is in effectPython:如何在不知道 DST 是否生效的情况下将时区感知时间戳转换为 UTC 【发布时间】:2013-10-31 21:11:38 【问题描述】:

我正在尝试将始终为太平洋时间的天真时间戳转换为 UTC 时间。在下面的代码中,我可以指定我拥有的这个时间戳是太平洋时间,但它似乎不知道它应该是距 UTC 的 -7 小时的偏移量,因为它只有 10/21 并且 DST 有还没有结束。

脚本:

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】:

使用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

the pytz documentation 的“示例和用法”部分对此进行了介绍。

然后继续UTC:

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

【讨论】:

要断言naive_date 是明确且存在的,您可以将is_dst=None 传递给localize();否则可能会默默选择错误的时间。

以上是关于Python:如何在不知道 DST 是不是生效的情况下将时区感知时间戳转换为 UTC的主要内容,如果未能解决你的问题,请参考以下文章

如何确定 DST 何时在 Python 中的特定位置开始或结束? [复制]

ConvertTimeFromUtc() 和 ToUniversalTime() 是不是处理 DST?

Python & pytz:确定时区是不是支持 DST 以及 DST 和非 DST UTC 偏移量是多少

如何在 Python 中查找同一小时的第二天 Unix 时间戳,包括 DST?

如何在 Java 中偏移日期以适应 DST

给定日期/时间作为字符串,知道当时是不是是 DST 的最佳方法是啥?