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

问题描述 投票:0回答:2
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>>

只需查看时区,正如您从输出中看到的那样,每当我尝试使用 tzinfo 传递时区(就像我在最后一个 d3 对象中所做的那样)时,它都会给我 LMT+5:53 而不是 +5:30 ,但前两个日期对象工作正常,帮帮我

python datetime timezone pytz
2个回答
7
投票

请参考https://pythonhosted.org/pytz/ 据说

“不幸的是,对于许多时区,使用标准日期时间构造函数的 tzinfo 参数对 pytz 来说“不起作用”。”

“处理时间的首选方法是始终使用 UTC,仅在生成可供人类读取的输出时才转换为本地时间。”

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

from datetime import datetime
import 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模块

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

希望这有用。

致以最诚挚的问候


0
投票

我同意“Raghuraman”的回应。

我使用的解决方法是:

    parsed = datetime.strptime(source, "%Y-%m-%d %H:%M:%S.%f")
    result = pytz.timezone('Asia/Calcutta').localize(parsed)
© www.soinside.com 2019 - 2024. All rights reserved.