为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

撒科打诨 2019-07-15 09:26:59
如何在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,所以在这种情况下,我准备接受违约的风险。
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

通常,若要使天真的日期时区感知到,请使用局部化方法:

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.)


查看完整回答
反对 回复 2019-07-15
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

所有这些示例都使用外部模块,但是您可以使用datetime模块实现相同的结果,如这个答案:

from datetime import datetimefrom datetime import timezone

dt = 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:
    from datetime import timezone
    utc = timezone.utcexcept 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()


查看完整回答
反对 回复 2019-07-15
?
jeck猫

TA贡献1909条经验 获得超7个赞

我用过从DT_知道到DT_NONISTION。

dt_unaware = dt_aware.replace(tzinfo=None)

和DT不知道的DT_感知

from pytz import timezone
localtz = timezone('Europe/Lisbon')dt_aware = localtz.localize(dt_unware)

但以前的回答也是一个很好的解决办法。


查看完整回答
反对 回复 2019-07-15
  • 3 回答
  • 0 关注
  • 473 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信