如何在python中识别未知的日期时间时区
我需要做什么
我有一个不了解时区的datetime对象,我需要向其添加一个时区,以便能够将其与其他时区感知的datetime对象进行比较。对于这一旧情况,我不想将我的整个应用程序转换为时区。
我尝试过的
首先,演示问题:
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> import pytz
>>> unaware = datetime.datetime(2011,8,15,8,15,12,0)
>>> unaware
datetime.datetime(2011, 8, 15, 8, 15, 12)
>>> aware = datetime.datetime(2011,8,15,8,15,12,0,pytz.UTC)
>>> aware
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> aware == unaware
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes
首先,我尝试了astimezone:
>>> unaware.astimezone(pytz.UTC)Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: astimezone() cannot be applied to a naive datetime
>>>
这次失败并不令人惊讶,因为它实际上是在尝试进行转换。替换似乎是一个更好的选择(根据Python:如何获取“时区感知”的datetime.today()值?):
>>> unaware.replace(tzinfo=pytz.UTC)datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> unaware == aware
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes
>>>
但是正如您所看到的,replace似乎设置了tzinfo,但没有使对象知道。我准备回过头来解析输入字符串以在解析它之前有一个时区(如果需要的话,我正在使用dateutil进行解析),但这似乎令人难以置信。
另外,我在python 2.6和python 2.7中都尝试过,结果相同。
语境
我正在为某些数据文件编写解析器。我需要支持一种旧格式,其中日期字符串没有时区指示符。我已经修复了数据源,但是我仍然需要支持旧数据格式。由于各种业务BS原因,无法一次转换旧数据。通常,我不喜欢对默认时区进行硬编码的想法,在这种情况下,这似乎是最好的选择。我非常有把握地知道所有有问题的旧数据都位于UTC中,因此在这种情况下,我准备接受默认设置的风险。
回答:
通常,要使原始的datetime
时区感知,请使用localize方法:
import datetimeimport pytz
unaware = datetime.datetime(2011, 8, 15, 8, 15, 12, 0)
aware = datetime.datetime(2011, 8, 15, 8, 15, 12, 0, pytz.UTC)
now_aware = pytz.utc.localize(unaware)
assert aware == now_aware
对于UTC时区,localize
由于没有夏令时计算可处理,因此实际上没有必要使用:
now_aware = unaware.replace(tzinfo=pytz.UTC)
作品。(.replace
返回一个新的日期时间;它不会修改unaware
。)
以上是 如何在python中识别未知的日期时间时区 的全部内容, 来源链接: utcz.com/qa/420635.html