猿问

如何在python中使不知情的日期时区知道

如何在python中使不知情的日期时区知道

我需要做的是

我有一个时区不知情的datetime对象,为了能够将它与其他时区感知的datetime对象进行比较,我需要添加一个时区。我不想把我的整个应用程序转换成时区,不知道这个遗留情况。

我试过的

首先,为了证明这个问题:

Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] on darwinType "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 == unawareTraceback (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的值,即“时区感知”?):

>>> unaware.replace(tzinfo=pytz.UTC)datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> unaware == awareTraceback (most recent call last):
  File "<stdin>", line 1, in <module>TypeError: can't compare offset-naive and offset-aware datetimes
>>>

但是正如您所看到的,替换似乎设置了tzinfo,但没有使对象意识到。我准备在解析输入字符串之前先修改输入字符串,使其具有一个时区(如果这重要的话,我将使用dateutil进行解析),但这似乎不可思议。

另外,我在python2.6和python2.7中都尝试过这一点,结果也是一样的。

语境

我正在为一些数据文件编写解析器。在日期字符串没有时区指示符的情况下,需要支持一种旧格式。我已经修复了数据源,但我仍然需要支持遗留数据格式。由于各种业务BS的原因,一次性转换遗留数据并不是一种选择。总的来说,我不喜欢硬编码默认时区的想法,在这种情况下,这似乎是最好的选择。我很有信心地知道所有的遗留数据都在UTC,所以在这种情况下,我准备接受违约的风险。


撒科打诨
浏览 474回答 3
3回答

呼如林

通常,若要使天真的日期时区感知到,请使用局部化方法:import&nbsp;datetimeimport&nbsp;pytz unaware&nbsp;=&nbsp;datetime.datetime(2011,&nbsp;8,&nbsp;15,&nbsp;8,&nbsp;15,&nbsp;12,&nbsp;0)aware&nbsp;=&nbsp;datetime.datetime(2011,&nbsp;8,&nbsp;15,&nbsp;8,&nbsp;15,&nbsp;12,&nbsp;0,&nbsp;pytz.UTC) now_aware&nbsp;=&nbsp;pytz.utc.localize(unaware)assert&nbsp;aware&nbsp;==&nbsp;now_aware对于UTC时区,没有必要使用localize由于没有夏令时计算来处理:now_aware&nbsp;=&nbsp;unaware.replace(tzinfo=pytz.UTC)起作用了。(.replace返回一个新的日期时间;它不会修改unaware.)

守着星空守着你

所有这些示例都使用外部模块,但是您可以使用datetime模块实现相同的结果,如这个答案:from&nbsp;datetime&nbsp;import&nbsp;datetimefrom&nbsp;datetime&nbsp;import&nbsp;timezone dt&nbsp;=&nbsp;datetime.now()dt.replace(tzinfo=timezone.utc)print(dt.replace(tzinfo=timezone.utc).isoformat())'2017-01-12T22:11:31+00:00'依赖项减少,没有pytz问题。注意:如果您希望将它与python 3和python 2一起使用,您也可以将其用于时区导入(硬编码用于UTC):try: &nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;datetime&nbsp;import&nbsp;timezone &nbsp;&nbsp;&nbsp;&nbsp;utc&nbsp;=&nbsp;timezone.utcexcept&nbsp;ImportError: &nbsp;&nbsp;&nbsp;&nbsp;#Hi&nbsp;there&nbsp;python2&nbsp;user &nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;UTC(tzinfo): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;utcoffset(self,&nbsp;dt): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;timedelta(0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;tzname(self,&nbsp;dt): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"UTC" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;dst(self,&nbsp;dt): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;timedelta(0) &nbsp;&nbsp;&nbsp;&nbsp;utc&nbsp;=&nbsp;UTC()

jeck猫

我用过从DT_知道到DT_NONISTION。dt_unaware&nbsp;=&nbsp;dt_aware.replace(tzinfo=None)和DT不知道的DT_感知from&nbsp;pytz&nbsp;import&nbsp;timezone localtz&nbsp;=&nbsp;timezone('Europe/Lisbon')dt_aware&nbsp;=&nbsp;localtz.localize(dt_unware)但以前的回答也是一个很好的解决办法。
随时随地看视频慕课网APP

相关分类

Python
我要回答