当将pytz.timezone()传递给tzinfo时,pytz返回LMT(本地平均时间)时区而不是GMT(格林威治标准时间)。
当将pytz.timezone()传递给tzinfo时,pytz返回LMT(本地平均时间)时区而不是GMT(格林威治标准时间)。
from datetime import datetime from pytz import timezone # 获取当前时间并指定时区为Asia/Calcutta d1 = datetime.now(tz=timezone('Asia/Calcutta')) # 创建一个指定日期和时间的datetime对象 d2 = datetime(2019, 12, 12, 12, 12, 12, 12) # 创建时区为Asia/Calcutta的datetime对象 zone = timezone('Asia/Calcutta') d2 = zone.localize(d2) # 创建一个带有时区信息的datetime对象 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> 2019-12-12 12:12:12.000012+05:30 > 2019-12-12 12:12:12.000012+05:53 >
请注意时区,从输出结果可以看出,无论是在最后的d3对象中像我所做的那样通过tzinfo传递时区,它都会给我返回LMT+5:53而不是+5:30,但前两个日期对象正常工作,请帮我解决这个问题。
pytz库在使用pytz.timezone()函数将时区传递给tzinfo参数时,返回LMT(Local Mean Time)时区而不是GMT(Greenwich Mean Time)时区。这个问题的根本原因是,pytz库在处理时区信息时存在一些限制。
根据官方文档(https://pythonhosted.org/pytz/)的说明,pytz库在许多时区中不能使用标准datetime构造函数的tzinfo参数。官方推荐的方式是始终使用UTC时间进行处理,并且只在生成供人阅读的输出时转换为本地时间。
下面是一个示例代码,展示了问题的复现和使用zoneinfo模块解决该问题的方法:
from datetime import datetime import pytz d1 = datetime.utcnow() # d1是无时区的 d2 = datetime(2019, 12, 12, 12, 12, 12, 12) # d2也是无时区的 zone = pytz.timezone('Asia/Calcutta') d2 = zone.localize(d2) # d2变为有时区的 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
通过使用zoneinfo模块,可以正确地获取到GMT时区的时间信息,解决了pytz库返回LMT时区的问题。
希望这篇文章对你有所帮助。
祝好!