当 pytz.timezone() 传递给 tzinfo 时,pytz 返回 LMT 时区而不是 GMT

Posted

技术标签:

【中文标题】当 pytz.timezone() 传递给 tzinfo 时,pytz 返回 LMT 时区而不是 GMT【英文标题】:pytz returns LMT timezone instead of GMT when pytz.timezone() passed to tzinfo 【发布时间】:2021-09-14 23:05:45 【问题描述】:
from datetime import datetime
from pytz import timezone
d1 = datetime.now(tz = timezone('Asia/Calcutta'))
d2 = datetime(2019,12,12,12,12,12,12)
zone = timezone('Asia/Calcutta')
d2 = zone.localize(d2)
d3 = datetime(2019,12,12,12,12,12,12,tzinfo = timezone('Asia/Calcutta'))
print(d1,d1.tzinfo.tzname)
print(d2,d2.tzinfo.tzname)
print(d3,d3.tzinfo.tzname)

这是我得到的输出

2021-07-03 14:00:03.135000+05:30 <bound method DstTzInfo.tzname of <DstTzInfo 'Asia/Calcutta' IST+5:30:00 STD>>
2019-12-12 12:12:12.000012+05:30 <bound method DstTzInfo.tzname of <DstTzInfo 'Asia/Calcutta' IST+5:30:00 STD>>
2019-12-12 12:12:12.000012+05:53 <bound method DstTzInfo.tzname of <DstTzInfo 'Asia/Calcutta' LMT+5:53:00 STD>>

只需查看时区,正如我在最后一个 d3 对象中尝试使用 tzinfo 传递时区时从输出中看到的那样,它给了我 LMT+5:53 而不是 +5:30 ,但第一个两个日期对象工作正常,帮帮我

【问题讨论】:

请做一些研究,这是一个众所周知的问题,您不能将 pytz 时区对象直接设置为 tzinfo。此外,如果您可以使用 Python 3.9 或更高版本,那么您一开始就不应该使用 pytz。使用zoneinfo。没有这样的担心。 【参考方案1】:

请参考https://pythonhosted.org/pytz/ 有人提到 '不幸的是,在许多时区使用标准日期时间构造函数的 tzinfo 参数''不起作用''。'

和 “处理时间的首选方式是始终以 UTC 工作,仅在生成供人类阅读的输出时转换为本地时间。”

抱歉,我无法理解您的代码背后的意图。从我的想法来看,也许这就是你想要的。

` 从日期时间导入日期时间 导入pytz

d1 = datetime.utcnow() # d1 is naive
d2 = datetime(2019,12,12,12,12,12,12) # d2 too
zone = pytz.timezone('Asia/Calcutta')  
d2 = zone.localize(d2) # d2 has become aware now
d3  = datetime(2019,12,12,12,12,12,12,tzinfo = pytz.utc)

print(d1)
print(d2,d2.tzinfo.tzname(d2))
print(d3,d3.tzinfo.tzname(d3))

` 输出是 2021-07-20 07:07:22.542644 2019-12-12 12:12:12.000012+05:30 IST 2019-12-12 12:12:12.000012+00:00 UTC

使用 zoneinfo 模块(python 3.9)的相同代码,在构造函数中提供 tzinfo 没有限制。 (zoneinfo module)

from datetime import datetime
from zoneinfo import *

d1 = datetime.utcnow() 
d2 = datetime(2019,12,12,12,12,12,12,tzinfo= ZoneInfo('Asia/Calcutta'))
d3  = datetime(2019,12,12,12,12,12,12,tzinfo = ZoneInfo('utc'))
print(d1)
print(d2,d2.tzinfo.tzname(d2))
print(d3,d3.tzinfo.tzname(d3))

输出是 2021-07-20 07:13:52.749333 2019-12-12 12:12:12.000012+05:30 IST 2019-12-12 12:12:12.000012+00:00 UTC

希望这是有用的。

致以最诚挚的问候

【讨论】:

以上是关于当 pytz.timezone() 传递给 tzinfo 时,pytz 返回 LMT 时区而不是 GMT的主要内容,如果未能解决你的问题,请参考以下文章

pytz.timezone 显示亚洲/加尔各答的奇怪结果? [复制]

pytz.timezone 显示亚洲/加尔各答的奇怪结果? [复制]

在 virtualenv 中第一次调用 pytz.timezone 很慢

`datetime.now(pytz timezone)` 啥时候失败?

python(pytz)中的奇怪时区行为

pytz UTC 转换