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

datetime.now returns wrong time if timezone changed after running interpreter

背景

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

问题

我发现 datetime.now() 编辑的时间 return 和 time.tzname 中的时区取决于口译员 运行 的时间。

重现步骤:

  1. 运行 解释器(在我的例子中是 3.6.5)
    python
  2. 更改时区
    timedatectl

  3. import datetime, time

  4. datetime.datetime.now()time.tzname return 在时区更改之前有效的值

调查

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

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

加载time模块时,time.tzname信息设置一次。 time 模块中有一个显式方法可以重新设置它,time.tzset():

Reset the time conversion rules used by the library routines. The environment variable TZ specifies how this is done. It will also set the variables tzname (from the TZ environment variable), timezone (non-DST seconds West of UTC), altzone (DST seconds west of UTC) and daylight (to 0 if this timezone does not have any daylight saving time rules, or to nonzero if there is a time, past, present or future when daylight saving time applies).

datetime.datetime.now() 不生成带时区的日期时间对象;你通常会明确地传递一个时区。