datetime.now returns 如果时区在 运行 解释器之后更改,则时间错误
datetime.now returns wrong time if timezone changed after running interpreter
背景
我有一个应用程序,其中 python 脚本通过 boost::python
与 C++ 代码绑定,并且 运行 遇到了一个问题,结果证明可以用 python 解释器重现。
问题
我发现 datetime.now()
编辑的时间 return 和 time.tzname
中的时区取决于口译员 运行 的时间。
重现步骤:
- 运行 解释器(在我的例子中是 3.6.5)
python
更改时区
timedatectl
import datetime, time
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()
不生成带时区的日期时间对象;你通常会明确地传递一个时区。
背景
我有一个应用程序,其中 python 脚本通过 boost::python
与 C++ 代码绑定,并且 运行 遇到了一个问题,结果证明可以用 python 解释器重现。
问题
我发现 datetime.now()
编辑的时间 return 和 time.tzname
中的时区取决于口译员 运行 的时间。
重现步骤:
- 运行 解释器(在我的例子中是 3.6.5)
python
更改时区
timedatectl
import datetime, time
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 variablestzname
(from theTZ
environment variable),timezone
(non-DST seconds West of UTC),altzone
(DST seconds west of UTC) anddaylight
(to0 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()
不生成带时区的日期时间对象;你通常会明确地传递一个时区。