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

时间:2019-01-03 10:56:04

标签: python python-3.x python-datetime

背景

我有一个应用程序,该应用程序带有通过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。

1 个答案:

答案 0 :(得分:2)

在装入time.tzname模块时,将time信息设置一次。 time模块中有一个显式方法可以将其重置,time.tzset()

  

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

datetime.datetime.now()不会产生带有时区的datetime对象;您通常会明确传递时区。