Background
我有一个应用程序,其中包含通过boost::python
与C++代码绑定的python脚本,并且遇到了一个问题,结果证明可以用python解释器重现。
问题
我发现datetime.now()
返回的时间和时区time.tzname
取决于解释器的运行时间。
重现步骤:
- 运行解释器(在我的情况下是 3.6.5)
python
-
更改时区
timedatectl
-
import datetime, time
-
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 秒)和daylight
(0 if
此时区没有任何夏令时规则,或者如果应用夏令时的时间、过去、现在或将来),则设置为非零值)。
datetime.datetime.now()
不会生成具有时区的 datetime 对象;您通常会显式传入时区。