当将pytz.timezone()传递给tzinfo时,pytz返回LMT(本地平均时间)时区而不是GMT(格林威治标准时间)。

6 浏览
0 Comments

当将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,但前两个日期对象正常工作,请帮我解决这个问题。

0
0 Comments

问题的出现原因是在使用pytz时,当传递pytz.timezone()给tzinfo时,pytz返回的是LMT时区而不是GMT时区。

解决方法是使用以下代码:

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

感谢给出提示的人。

0
0 Comments

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时区的问题。

希望这篇文章对你有所帮助。

祝好!

0