我需要做什么
我有一个不知道时区的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
>>>
这并不奇怪,因为它实际上是在尝试进行转换。替换似乎是更好的选择(根据How do I get a value of datetime.today() in Python that is "timezone aware"?):
>>> 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进行解析),但这看起来非常笨拙
另外,我在Python2.6和Python2.7中都尝试过这个方法,得到了相同的结果
上下文
我正在为一些数据文件编写解析器。我需要支持一种旧格式,其中日期字符串没有时区指示器。我已经修复了数据源,但仍然需要支持遗留数据格式。由于各种业务原因,一次性转换遗留数据不是一种选择。一般来说,我不喜欢硬编码默认时区的想法,在这种情况下,它似乎是最好的选择。我有充分的信心知道所有有问题的遗留数据都是UTC的,因此我准备承担在这种情况下违约的风险
我在2011年11月22日写了这篇文章,仅仅是Pyhton 2,从未检查过它是否在Python 3上工作
我从知道到不知道都有使用
你不知道你知道吗
但是,事先回答也是一个很好的解决办法
所有这些示例都使用外部模块,但您可以仅使用datetime模块来实现相同的结果,如this SO answer中所示:
更少的依赖项,没有pytz问题
注意:如果希望将其用于python3和python2,也可以将其用于时区导入(UTC硬编码):
通常,要使原始日期时间时区具有感知能力,请使用localize method:
对于UTC时区,实际上没有必要使用
localize
,因为没有夏令时计算来处理:工作。(
.replace
返回新的日期时间;它不修改unaware
。)相关问题 更多 >
编程相关推荐