为什么datetime.now()和datetime.today()在我的电脑上显示UTC时间而不是当地时间?

R S*_*ahu 12 python datetime python-3.x

datetime.now()并且datetime.today()在我的计算机上以UTC返回时间,即使文档说他们应该返回当地时间.

这是我运行的脚本:

#!/usr/bin/python

import time
import datetime

if __name__ == "__main__":
   print(datetime.datetime.now())
   print(datetime.datetime.today())
   print(datetime.datetime.fromtimestamp(time.time()))
Run Code Online (Sandbox Code Playgroud)

这是输出:

2017-11-29 22:47:35.339914
2017-11-29 22:47:35.340399
2017-11-29 22:47:35.340399
Run Code Online (Sandbox Code Playgroud)

date之后运行的输出是:

Wed, Nov 29, 2017  3:47:43 PM
Run Code Online (Sandbox Code Playgroud)

为什么我的安装返回UTC时间?
我该怎么办才能让这些功能返回当地时间?

PS我们在MST,这是UTC-7.

PS 2我意识到有一些方法可以将UTC时间转换为本地时间,例如在使用python标准库将python UTC datetime转换为本地日期时所解释的那些方法?.但是,我试图了解基本问题的原因,而不是寻找一种方法来修补我自己的代码中的问题.


回应@jwodder的评论:

执行的输出

print(time.altzone)
print(time.timezone)
print(time.tzname)
Run Code Online (Sandbox Code Playgroud)

是:

-3600
0
('Ame', 'ric')
Run Code Online (Sandbox Code Playgroud)

Nat*_*eks 6

正如您在答案中所述,TZ环境变量是此处的关键.在unix类型的系统上,它支持更多"友好"的值,如"US/Pacific"或者"America/Denver",但在Windows上,它不支持.虽然它在Windows上不可用,但time.tzset功能文档描述了设置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)
Run Code Online (Sandbox Code Playgroud)

(这是太平洋时间的15:27.)这种格式的结构是:

  • 标准时间缩写(MST)
  • 标准时间的UTC偏移量,以小时为单位(+07)
  • 夏令时缩写
  • 白天时间开始时(见下文)
  • 白天时间结束时(见下文)

白天时间开始和结束的格式为:

  • M ("以月为基础")
  • 月份数 - 3月/ 3月或11月/ 11月,在这种情况下.
  • 每月的一周 - 1到5,表示下面命名的第1到第5次发生.
  • 星期几 - 星期日0到星期六6

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

(编辑)事实证明这实际上是一个glibc功能,而不是直接的python功能.glibc文档中有更详细的信息.