pytz 为“非洲/喀土穆”提供错误的时区偏移

Posted

技术标签:

【中文标题】pytz 为“非洲/喀土穆”提供错误的时区偏移【英文标题】:pytz giving wrong timezone offset for 'Africa/Khartoum' 【发布时间】:2020-10-11 12:32:24 【问题描述】:

我有以下代码

import datetime
import pytz

tz_offset = datetime.datetime.now(pytz.timezone('Africa/Khartoum' or 'GMT')).strftime('%z')
print(tz_offset)

预期的输出是“+0200”,但它给出的是“+0300”。

由于 pytz 从 IANA 获得信息,我联系了他们,他们说在他们的数据库中设置正确。这是他们的电子邮件回复:

20 年 6 月 19 日上午 10:40,Ubay Abdelgadir 写道:

自 2017 年 11 月 1 日起,喀土穆的时区为 +2。我认为这是错误的 IANA 数据库:

Zone Africa/Khartoum 2:10:08 - LMT 1931
    2:00 Sudan CA%sT 2000 Jan 15 12:00
    3:00 - EAT 2017 Nov  1
    2:00 - CAT

该数据条目显示,自 2017 年 11 月以来,非洲/喀土穆一直是 +02 1,所以它似乎同意你的说法,即喀土穆的时间 自 2017 年 11 月 1 日起,区域为 +2。

编辑

我通过更新 pytz 版本解决了这个问题,它是 2016.7,对于我的情况来说已经过时了(2017 年发生了变化)

【问题讨论】:

Weird timezone issue with pytz 回答你的问题了吗? 【参考方案1】:

我无法重现 datetime.datetime.now 的示例。 pytz 还显示了 2017 年时区“非洲/喀土穆”的正确 UTC 偏移变化。但是,您需要使用localize 方法(参见例如here)。

import datetime
import pytz

tz = pytz.timezone('Africa/Khartoum')

# correct UTC offset for "now":
tz_offset = tz.localize(datetime.datetime.now()).strftime('%z')
print(tz_offset)
# +0200

# also correct UTC offset around 1st Nov 2017:
tz_offset = tz.localize(datetime.datetime(2017,10,31)).strftime('%z')
print(tz_offset)
# +0300
tz_offset = tz.localize(datetime.datetime(2017,11,1)).strftime('%z')
print(tz_offset)
# +0200

如果你没有localize,你只会得到local mean time。使用dateutil,您无需本地化并可以直接实现时区:

import dateutil
tz = dateutil.tz.gettz('Africa/Khartoum')
tz_offset = datetime.datetime(2017,10,31, tzinfo=tz).strftime('%z')
print(tz_offset)
# +0300
tz_offset = datetime.datetime(2017,11,1, tzinfo=tz).strftime('%z')
print(tz_offset)
# +0200

【讨论】:

我在我的笔记本电脑上试过这个,没用。但是在一个在线测试网站repl.it上试了一下,果然奏效了! 奇怪的是,上面的 pytz 代码在我的笔记本电脑上不起作用(所有偏移量都为 +0300),但在在线测试网站上工作。 @ObayAbd-Algader:这很奇怪......供参考:我在 Windows 10 上使用 Python 3.8.2 x64 和 pytz 2020.1。 是的。我刚刚发现我的 pytz 版本是 2016.7,这对于我的情况来说已经过时了。在我更新模块后,您的代码运行良好。 @ObayAbd-Algader:非常好。我建议不要使用pytz,除非您需要与旧脚本或 Python2 兼容。目前,dateutil 在我看来是更好的选择(例如,没有“localize 陷阱”)。将来,Python 3.9 将具有 zoneinfo 模块,因此将内置时区功能(不再需要 3rd 方包)。

以上是关于pytz 为“非洲/喀土穆”提供错误的时区偏移的主要内容,如果未能解决你的问题,请参考以下文章

来自 UTC 偏移的 Pytz 时区

pytz 时区的 STD 偏移量

Python pytz 时区转换返回的值与不同日期的时区偏移量不同

使用 pytz 从 UTC 偏移“规范”?

Python & pytz:确定时区是不是支持 DST 以及 DST 和非 DST UTC 偏移量是多少

带有 pytz 时区的日期时间。不同的偏移量取决于 tzinfo 的设置方式[重复]