datetime.now 如果在运行解释器后时区更改,则返回错误的时间



Background

我有一个应用程序,其中包含通过boost::python与C++代码绑定的python脚本,并且遇到了一个问题,结果证明可以用python解释器重现。

问题

我发现datetime.now()返回的时间和时区time.tzname取决于解释器的运行时间。

重现步骤:

  1. 运行解释器(在我的情况下是 3.6.5)
    python
  2. 更改时区
    timedatectl

  3. import datetime, time

  4. datetime.datetime.now()time.tzname返回时区更改前有效的值

调查

如果在时区更改后运行解释器,则值正确。如果我关闭解释器(在我的原始问题中不可行,应用程序必须 24/7 全天候运行)并运行一个新解释器,一切正常。

当我导入库时,importlib.reload()没有帮助。 python2(2.7.15)没有这个问题,但我需要python3。

加载

time模块时,time.tzname信息设置一次。time模块中有一个显式方法来重置它,time.tzset()

重置库例程使用的时间转换规则。环境变量TZ指定如何完成此操作。它还将变量tzname(来自 TZ 环境变量)、timezone(UTC 以西的非 DST 秒)、altzone(UTC 以西的 DST 秒)和daylight0 if此时区没有任何夏令时规则,或者如果应用夏令时的时间、过去、现在或将来),则设置为非零值)。

datetime.datetime.now()不会生成具有时区的 datetime 对象;您通常会显式传入时区。

最新更新