【问题标题】:Python2 vs Python3: Different result when converting to datetime from timestampPython2 vs Python3:从时间戳转换为日期时间时的不同结果
【发布时间】:2018-11-01 06:50:05
【问题描述】:

我正在尝试将一些代码从 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)

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)

python2 = (2016, 4, 19, 17, 10, 31) 的结果,而python3 = (2016, 4, 19, 22, 40, 31) 的结果。 为什么会有这种差异,我应该如何克服这个差异?

【问题讨论】:

  • 我在英国的 3.6 中得到 datetime.datetime(2016, 4, 19, 18, 10, 31)。我认为os.environ['TZ'] = 'UTC' 没有任何作用
  • 很奇怪,它显示 python2.7 和 python3.6.2 的日期时间相同
  • 这些是基于云的 Linux 实例吗?
  • @Arpit 你的 python3.6 和你的 python2.7 是从同一个系统运行的吗? @roganjosh 可能是正确的,UTC 没有效果。
  • @roganjosh 我在本地机器上使用 python 2 和 3 得到了不同的结果。也许他们使用时区的方式有所不同

标签: python python-3.x datetime


【解决方案1】:

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

time.tzset 文档说:

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

只需输入time.tzset():

已编辑:我刚刚进行了一些搜索,此行为已(错误地)报告为错误:datetime in Python 3.6+ no longer respects 'TZ' environment variable

【讨论】:

  • 链接的文档还说:“尽管在许多情况下,更改 TZ 环境变量可能会影响 localtime() 等函数的输出,而无需调用 tzset(),但不应依赖此行为。”我认为这个答案很有帮助。注意datetime.fromtimestamp 调用time.localtime
  • @roganjosh 这是关于更改 TZ 变量的影响。我看到这很混乱,直到现在我仍然对这些事情不太确定:(
  • “据我所知,这只发生在 python 3.6 上”你是怎么想到这个的?因为tutorialspoint.com/execute_python3_online.php 并没有真正反映它。这个问题提出了一些关于日期时间如何工作的真正问题。 OP 和我在同一个 TZ,所以我们的输出也一样,除了 python 3.6
  • @angrysmit 我刚刚对我的答案进行了编辑。查看错误报告了解更多详情
猜你喜欢
  • 2021-11-30
  • 2021-11-10
  • 1970-01-01
  • 2020-04-04
  • 2017-04-25
  • 2020-06-15
  • 2022-01-08
相关资源
最近更新 更多