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 ,但前两个日期对象工作正常,帮帮我
请参考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
希望这有用。
致以最诚挚的问候
我同意“Raghuraman”的回应。
我使用的解决方法是:
parsed = datetime.strptime(source, "%Y-%m-%d %H:%M:%S.%f")
result = pytz.timezone('Asia/Calcutta').localize(parsed)