我刚刚注意到这一点,我完全困惑,不知道为什么会发生这种情况,以及如何防止它.

我工作的计算机是Windows 10,安装在哥本哈根市.我的平台是:

$ for ix in "uname -s" "python3 --version"; do echo "$ix: " $($ix); done
uname -s:  MINGW64_NT-10.0-19045
python3 --version:  Python 3.11.9

由于我在MINGW 64下使用bash终端,因此我还为.bashrc中的python 3设置了一个别名:

alias python3="winpty python3"

好的;所以现在我想通过在bash终端中调用python3命令来打印tzlocal.get_localzone():

$ python3 -c 'import tzlocal; print(tzlocal.get_localzone())'
Europe/Copenhagen

太好了,我准确地得到了时区.然而,回想一下这里的python3实际上是winpty python3;要测试just python3,让我们在命令前添加反斜线,以摆脱bash别名:

$ \python3 -c 'import tzlocal; print(tzlocal.get_localzone())'
Europe/Paris

太棒了--我从来没有想到会这样;为什么我会在这里看到巴黎,而不是哥本哈根(这就是那台机器上Windows 10本身的设置目的)?

我的意思是,就时区而言,这并不遥远--但当明显有条件使其输出正确的时区时,为什么要满足于更少的时间呢?

那么,为什么会发生这种情况--我如何才能让tzlocal.get_localzone()分中的\python3分返回欧洲/哥本哈根?


编辑:通过在这两种情况下打印os.environ,可以看到winpty Python环境定义了环境变量"ZZ":"Europe/Copenhagen"-而直接Python环境没有这样的变量.

推荐答案

一些背景:WindowsIANA在其时区数据库中使用不同的时区标识符.tzlocal为您提供ANA标识符.因此,当您使用Windows时,您需要这两个时区数据库系统之间的映射.这很容易出错,因为ANA和MS之间没有就这应该是明确的达成一致(另请参阅timezone tag wiki,"时区数据库"部分).tzlocal为此依赖a community effort.

在Windows上,如果我将tz设置为Copenhagen,Windows会在内部使用"浪漫标准时间"(目前; 2024年4月18日).您可以通过在终端中运行tzutil /g来判断这一点.如果您判断我上面链接的ML文件,第一个映射是."欧洲/巴黎"."欧洲/哥本哈根"也被列在下方.这两个时区遵循相同的规则AFAIK,因此映射是"OK"(在UTC偏差方面正确),但并不完美.

至于为什么你会得到different个结果;我认为你已经在"printing os.environ in both cases, can see that the winpty python environment defines an environment variable 'TZ': 'Europe/Copenhagen'"."中提供了解释.tzlocal looks for the TZ environment variable.如果将其设置为ANA DB标识符,则会返回它,因为这实际上比上述Windows tz映射更可靠.

Python相关问答推荐

优化在numpy数组中非零值周围创建缓冲区的函数的性能

更改matplotlib彩色条的字体并勾选标签?

如何在具有重复数据的pandas中对groupby进行总和,同时保留其他列

比较两个数据帧并并排附加结果(获取性能警告)

时间序列分解

SQLGory-file包FilField不允许提供自定义文件名,自动将文件保存为未命名

需要计算60,000个坐标之间的距离

按列分区,按另一列排序

管道冻结和管道卸载

Python虚拟环境的轻量级使用

Asyncio:如何从子进程中读取stdout?

有没有一种ONE—LINER的方法给一个框架的每一行一个由整数和字符串组成的唯一id?

如何创建引用列表并分配值的Systemrame列

从源代码显示不同的输出(机器学习)(Python)

Python类型提示:对于一个可以迭代的变量,我应该使用什么?

Pandas 数据帧中的枚举,不能在枚举列上执行GROUP BY吗?

仅使用预先计算的排序获取排序元素

提取最内层嵌套链接

将字节序列解码为Unicode字符串

Scipy.linprog的可行性有问题吗?(A_ub@x0<;=b_ub).all()为True-但是-linprog(np.zeros_like(X0),A_ub=A_ub,b_ub=b_ub)不可行