为什么Python认为它的时区是UTC,而系统则是PDT/PST?

3
在我的Ubuntu Linux系统上,系统时区已正确设置为America/Vancouver
$ file /etc/localtime 
/etc/localtime: symbolic link to /usr/share/zoneinfo/America/Vancouver

$ date
Thu 17 Nov 10:31:38 PST 2022

$ date '+%Y-%m-%d %H:%M:%S%z'
2022-11-17 10:32:57-0800

$ date '+%Y-%m-%d %H:%M:%S%Z'
2022-11-17 10:33:04PST

这一切都是正确的,正如预期的那样。

然而,Python似乎认为 的时区是UTC:

$ python -c "import time; print(time.tzname); print(time.localtime());"
('UTC', 'UTC')
time.struct_time(tm_year=2022, tm_mon=11, tm_mday=17, tm_hour=18, tm_min=34, tm_sec=0, tm_wday=3, tm_yday=321, tm_isdst=0)

$ python -c 'from datetime import datetime; print(datetime.utcnow()); print(datetime.now());'
2022-11-17 18:34:38.878930
2022-11-17 18:34:38.878956

该系统正在运行 Python 3.10.8 和 Ubuntu 22.04.1 LTS。
我是否对Python的时区有所误解?发生了什么?如何使python的 time.tzname 与系统时区 PST 匹配?我不想在自己的python脚本中手动硬编码时区 - 我只想使用当前系统的本地时区。

1
看这里:https://dev59.com/C3E85IYBdhLWcg3wikS-。 像广为人知的 pytzdateutil 这样的外部库被广泛使用,我在尝试了标准模块处理时区后也走了同样的路线。在我看来,这绝对是太棘手了。 - 0x0fba
看起来是 Python 的 bug?你的例子在我的系统上使用相同的配置运行良好。 - exciteabletom
使用Python 3.9+,可以使用标准库中的zoneinfo模块来处理时区。 - FObersteiner
1个回答

0

原来这是由Homebrew/linuxbrew引起的。

它安装了自己的Python版本作为依赖项,而poetry从中选择了一个,正如您可以从此处poetry debug info看到的那样。

我完全删除了Homebrew(它的Linux实现一直让我感觉很糟糕,这已经足够让我放弃它了)。这破坏了poetry,所以我卸载并重新安装了poetry - 这解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接