当 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 很慢