python pytz是什么

Python (221) 2023-04-28 09:35:47

pytz模块常用于时区的转换,常常配合datetime一起使用。我们知道datetime除了data方法生成的时间是没有时区概念,其他如time、datetime等都是有时区概念,即指定了tzinfo信息。

>>>importdatetime
>>>datetime.datetime.now(tz)
datetime.datetime(2009,2,21,15,12,33,906000,tzinfo=<DstTzInfo'Asia/Shanghai'CST+8:00:00STD>)
>>>datetime.datetime(2009,2,21,15,12,33,tzinfo=tz)
datetime.datetime(2009,2,21,15,12,33,tzinfo=<DstTzInfo'Asia/Shanghai'LMT+8:06:00STD>)
>>>datetime.date(2009,2,21,tzinfo=tz)
Traceback(mostrecentcalllast):
File"<stdin>",line1,in<module>
TypeError:'tzinfo'isaninvalidkeywordargumentforthisfunction
>>>datetime.time(15,12,33,tzinfo=tz)
datetime.time(15,12,33,tzinfo=<DstTzInfo'Asia/Shanghai'LMT+8:06:00STD>)

时区转换

·pytz.country_timezones(‘国家代码’):此方法可以拿到某个国家的时区名列表。

相关推荐:《Python教程》

>>>(pytz.country_timezones('cn')
['Asia/Shanghai','Asia/Urumqi']

·pytz.timezone(‘时区名’):此方法能获取一个tzinfo对象,该对象可在datetime生成时间中以参数的形式放入,即可生成对应时区的时间。

>>>utc=pytz.timezone('UTC')
>>>datetime.datetime.now(tz=utc)
2019-05-1010:53:46.000929+00:00

实际上,现在时间为18:53:46

·查看有哪些时区

pytz有all_timezones、common_timezones这两个属性来查看有哪些时区。

frompytzimportall_timezones,common_timezones

·时间按时区转换

这要用到datetime模块的astimezone方法来实现。如下所示,开始生成本地时间,然后在转成utc时间。

importdatetime
importpytz
utc=pytz.timezone('UTC')
now_time=datetime.datetime.now()
utc_time=now_time.astimezone(tz=utc)
print(now_time,utc_time)
2019-05-1019:02:53.4995132019-05-1011:02:53.499513+00:00

对于有采用了夏时制的要使用时区对象的normzlize方法来处理,如下所示:

importdatetime
importpytz
utc=pytz.timezone('UTC')
now_time=datetime.datetime.now()
utc_time=utc.normalize(now_time.astimezone(tz=utc))
print(now_time,utc_time)
2019-05-1019:08:25.2866902019-05-1011:08:25.286690+00:00

·LMT问题

LMT,这是Local Mean Time的缩写,网上查一查意思是本地平均时。而且时间是+8:06,说明与UTC的时差不是8个小时整。下面有一个问题是,当我们用pytz.timezone('Asia/Shanghai') 生成的时区是LMT,而非标准的CST(就是Central Standard Time的意思)。那么这会造成什么后果呢?下面来展示下:

<DstTzInfo'Asia/Shanghai'LMT+8:06:00STD>
>>>d=datetime.datetime(2019,5,10,19,12,30,tzinfo=tz)
>>>d
datetime.datetime(2019,5,10,19,12,30,tzinfo=<DstTzInfo'Asia/Shanghai'LMT+8:06:00STD>)
>>>d=d.astimezone(utc)
>>>d
datetime.datetime(2019,5,10,11,6,30,tzinfo=<UTC>)
>>>d.astimezone(tz)
datetime.datetime(2019,5,10,19,6,30,tzinfo=<DstTzInfo'Asia/Shanghai'CST+8:00:00STD>)

由上述可以发现,刚开始由datetime.datetime()生成的时间是LMT,接下来我将其转换为UTC时区的时间,最后又转回来,我们可以发现,现在的时间又变成了CST标准。而这两个标准,就直接导致其相差了6分钟。

下面我们可以用时区对象的localize方法,将LMT准换为CST,使其统一。

>>>datetime.datetime(2019,5,10,20,30,32,tzinfo=tz)
datetime.datetime(2019,5,10,20,30,32,tzinfo=<DstTzInfo'Asia/Shanghai'LMT+8:06:00STD>)
>>>tz.localize(datetime.datetime(2019,5,10,20,30,32))
datetime.datetime(2019,5,10,20,30,32,tzinfo=<DstTzInfo'Asia/Shanghai'CST+8:00:00STD>)

所以我的建议是生成带时区的时间时,一定要使用timezone.localize()来生成。不要在时间对象的构造函数中传入tzinfo的方式来实现。

THE END

发表回复