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

4
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,但前两个日期对象工作正常,请帮忙解决。

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及以上版本)时,可以在构造函数中任意指定时区信息。(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日 17时42分12.000012秒 IST

2019年12月12日 12时12分12.000012秒 UTC

希望这对您有所帮助。

祝好,


0

我同意“Raghuraman”的回复。

我使用的解决方法是:

    parsed = datetime.strptime(source, "%Y-%m-%d %H:%M:%S.%f")
    result = pytz.timezone('Asia/Calcutta').localize(parsed)

更新了。感谢提示。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接