向后移植到python 2.7时带时区的Python脚本失败

时间:2018-08-18 23:14:41

标签: python timezone

我有一个在python 3.6.4上运行的python脚本,请在本地购买,尝试在具有python 2.7的系统上运行它。

File "report_scheduler.py", line 5, in <module>
from datetime import datetime, timedelta, timezone, tzinfo
ImportError: cannot import name timezone

我似乎无法导入时区模块。我似乎无法安装时区模块。有没有简单的方法可以导入该模块或修改脚本以使其不需要?我对该模块的仅有两个引用如下。

from datetime import datetime, timedelta, timezone, tzinfo

last_run=(row[4]).replace(tzinfo=timezone.utc)
time_since_last_request = datetime.now(timezone.utc) - last_run

2 个答案:

答案 0 :(得分:1)

1)的原因:如概述this answer datetime.now(timezone.utc)中的版本仅适用于Python 3.2和更高版本

2)进行修复:我将使用以下简短代码段,例如以下[check this other answer作为参考]:

import pytz  # 3rd party: $ pip install pytz
from datetime import datetime

u = datetime.utcnow()
u = u.replace(tzinfo=pytz.utc) #NOTE: it works only with a fixed utc offset

# print(u)   # prints UTC time
# print(u.astimezone(pytz.timezone("America/New_York")))     # prints another timezone

答案 1 :(得分:0)

首先,您不是在导入timezone模块,而是从timezone模块导入datetime类。因此,即使有这样的事情,尝试安装timezone模块也无济于事。

同时,正如the docs所说,timezone类是在Python 3.2中添加的,因此在2.7中没有它。

以前datetime模块的反向移植是从Python 3.4到2.7,这可以解决您的问题,但似乎早在几年前就被放弃了。


因此,只需修改代码即可,而无需timezone

幸运的是,您使用过的timezone的唯一实例是UTC实例,并且很容易解决。

timezone类只是tzinfo类的预构建实现。在2.x中,您必须实现自己的tzinfo类。但是文档中琐碎的class UTC示例恰好正是您想要的:

ZERO = timedelta(0)
HOUR = timedelta(hours=1)

class UTC(tzinfo):
    """UTC"""

    def utcoffset(self, dt):
        return ZERO

    def tzname(self, dt):
        return "UTC"

    def dst(self, dt):
        return ZERO

utc = UTC()

现在,在所有使用timezone.utc的地方,只需使用utc,就可以了。