datetime.now()datetime.today() 在我的计算机上返回 UTC 时间,即使 the documentation 说他们应该返回本地时间。

这是我运行的脚本:

#!/usr/bin/python

import time
import datetime

if __name__ == "__main__":
   print(datetime.datetime.now())
   print(datetime.datetime.today())
   print(datetime.datetime.fromtimestamp(time.time()))

这是输出:

2017-11-29 22:47:35.339914
2017-11-29 22:47:35.340399
2017-11-29 22:47:35.340399

在它之后运行 date 的输出是:

Wed, Nov 29, 2017  3:47:43 PM

为什么我的安装返回时间是 UTC?
我该怎么做才能让这些函数返回本地时间?

PS 我们在 MST,即 UTC-7。

PS 2 我意识到有一些方法可以将 UTC 时间转换为本地时间,例如 Convert a python UTC datetime to a local datetime using only python standard library? 中解释的那些。但是,我试图了解根本问题的原因,而不是在我自己的代码中寻找修补问题的方法。

回应@jwodder 的评论:

执行的输出
print(time.altzone)
print(time.timezone)
print(time.tzname)

是:

-3600
0
('Ame', 'ric')

最佳答案

正如您在 your answer 中注意到的, 0x2518122231343141 环境变量是这里的关键。在 unix 类型的系统上,这支持更“友好”的值,如“美国/太平洋”或“美国/丹佛”,但在 Windows 上,它不支持。虽然它在 Windows 上不可用,但 documentation for the TZ function 描述了您需要设置 TZ 以获得您想要的格式。这……不漂亮。但它有效:

C:\Users\zorb>set TZ=MST+07MDT,M3.2.0,M11.1.0
C:\Users\zorb>python.exe
>>> import time
>>> time.tzname
('MST', 'MDT')
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2018, 2, 9, 16, 27, 7, 164062)

(这是在太平洋时间 15:27。)这种格式的结构是:
  • 标准时间缩写(MST)
  • UTC 标准时间的偏移量,以小时为单位 (+07)
  • 夏令时缩写
  • 夏令时开始时(见下文)
  • 白天结束时(见下文)

  • 夏令时开始和结束的格式为:
  • time.tzset(对于“基于月”)
  • 月份数 - 3/3 月或 11/11 月,在这种情况下。
  • 一个月中的第几周 - 1 到 5,表示下面命名的第 1 到 5 天。
  • 星期几 - 星期日为 0,星期六为 6

  • 还有一些选项可以指定夏令时开始和结束的时间(但默认为 02:00:00,因此在这种情况下没有必要)和夏令时的偏移量(但默认为 1 小时,因此也没有必要) )。

    (编辑)结果这实际上是一个 glibc 功能,而不是直接的 Python 功能。 glibc docs 中的更多详细信息。

    关于python - 为什么 datetime.now() 和 datetime.today() 在我的 PC 上以 UTC 而不是本地时间显示时间?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47563103/

    10-12 23:17
    查看更多