Python比较不同环境(Docker和本地机器)上的整数。
Python比较不同环境(Docker和本地机器)上的整数。
我需要做什么
我有一个不包含时区信息的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=) >>> aware == unaware Traceback (most recent call last): File "", line 1, in TypeError: can't compare offset-naive and offset-aware datetimes
首先,我尝试使用astimezone:
>>> unaware.astimezone(pytz.UTC) Traceback (most recent call last): File "", line 1, in ValueError: astimezone() cannot be applied to a naive datetime >>>
这个失败并不令人惊讶,因为它实际上是在尝试进行一个转换。用replace似乎是更好的选择(如此处所述):
>>> unaware.replace(tzinfo=pytz.UTC) datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=) >>> unaware == aware Traceback (most recent call last): File "", line 1, in TypeError: can't compare offset-naive and offset-aware datetimes >>>
但正如你所看到的,replace似乎设置了tzinfo,但却没有使对象变得带有时区信息。我准备在解析之前修改输入字符串以添加时区信息(如果那很重要的话,我正在使用dateutil进行解析),但这似乎非常笨拙。
此外,我已经在Python 2.6和Python 2.7中尝试了这个问题,结果都一样。
上下文
我正在编写一些数据文件的解析器。有一个我需要支持的旧格式,其中日期字符串没有时区指示符。我已经修复了数据源,但我仍然需要支持旧数据格式。基于各种业务原因,一次性转换遗留数据不是一个选项。尽管一般情况下我不喜欢硬编码一个默认时区的想法,但在这种情况下,它似乎是最好的选择。我有相当的信心,所有相关的旧数据都在UTC时区,因此我准备接受在这种情况下默认为UTC的风险。
\n\n这些例子都使用了外部模块,但你也可以仅仅使用datetime模块来实现相同的结果,就像此 SO 回答中所介绍的一样:\n
from datetime import datetime, timezone dt = datetime.now() dt = dt.replace(tzinfo=timezone.utc) print(dt.isoformat()) # '2017-01-12T22:11:31+00:00'
\n减少了依赖和pytz问题。\n注意:如果你希望在python3和python2中使用它,你也可以使用它来导入时区(硬编码为UTC):\n
try: from datetime import timezone utc = timezone.utc except ImportError: #Hi there python2 user class UTC(tzinfo): def utcoffset(self, dt): return timedelta(0) def tzname(self, dt): return "UTC" def dst(self, dt): return timedelta(0) utc = UTC()
通常,要使一个naive datetime具有时区意识,可以使用localize方法:
import datetime import 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
,它返回一个新的datetime;它不会修改unaware
。