Python2与Python3:从时间戳转换为datetime时的结果不同

Arp*_*ria 5 python datetime python-3.x

我试图将一些代码从python2移植到python3.使用日期/时间操作转换某些代码时遇到问题.

Python2.7

Python 2.7.13 (default, Apr 19 2017, 02:44:33) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> import os
>>> os.environ['TZ'] = 'UTC'
>>> datetime.datetime.fromtimestamp(1461085831)
datetime.datetime(2016, 4, 19, 17, 10, 31)
Run Code Online (Sandbox Code Playgroud)

Python3.6

Python 3.6.1 (default, Apr 19 2017, 21:58:41) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> import os
>>> os.environ['TZ'] = 'UTC'
>>> datetime.datetime.fromtimestamp(1461085831)
datetime.datetime(2016, 4, 19, 22, 40, 31)
Run Code Online (Sandbox Code Playgroud)

结果python2 = (2016, 4, 19, 17, 10, 31)python3 = (2016, 4, 19, 22, 40, 31).为什么会出现这种差异,我该如何克服这个问题呢?

ena*_*ria 7

这有点棘手.根据我的知识,这只发生在python 3.6.简而言之,您需要time.tzset在设置TZ环境后调用.我前段时间遇到过它(我记不清楚了),而且我没有测试3.6之前的python,所以请耐心等待.我刚刚在我的同事身上检查了这个问题python3.5,它按预期工作(没有放time.tzset())

time.tzset文件说:

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

只需把time.tzset():

查看结果

编辑:我刚刚做了一些搜索,这个行为被(错误地)报告为一个bug:Python 3.6+中的datetime不再尊重'TZ'环境变量