pytz格式化北京时间多出6分钟问题的解决方法
起步
在django框架中,用的是pytz库处理时区问题,所以我也尝试用这个库来处理。但发现了一个奇怪的问题:
importdatetime importpytz dt=datetime.datetime(2019,6,20,12,tzinfo=pytz.timezone('Asia/Shanghai')) print(dt)#2019-06-2012:00:00+08:06
为什么多出了6分钟来?
原因
这是因为pytz里保存是本地时间。
fmt='%Y-%m-%d%H:%M:%S%Z%z' dt=datetime.datetime(2019,6,20,12,tzinfo=pytz.timezone('Asia/Shanghai')) print(dt.strftime(fmt))#2019-06-2012:00:00LMT+0806
LMT即LocalMeanTime本地时间,也就是说'Asia/Shanghai'这个地区比utc多了8小时零6分钟,并不是北京时间。
解决
所以pytz提供了normalize()方法来纠正这个问题,但传入的得是不带时区的日期对象:
cn_zone=pytz.timezone('Asia/Shanghai') dt=cn_zone.localize(dt=datetime.datetime(2019,6,20,12)) print(dt)#2019-06-2012:00:00+08:00 print(dt.strftime(fmt))#2019-06-2012:00:00CST+0800 #或者 dt=datetime.datetime(2019,6,20,12) print(dt.astimezone(cn_zone))#2019-06-2012:00:00CST+0800
这里推荐的还是用astimezone的方式,django也是采用这种处理方式。
时区转换
以从北京时间转纽约时间为例,已知结果它们之间应该相差12小时。
dt=datetime.datetime(2019,6,20,12) print(dt.astimezone(tz=cn_zone))#2019-06-2012:00:00+08:00 print(dt.astimezone(tz=cn_zone).astimezone(ny_zone))#2019-06-2012:00:00-04:56
额外
另一个解决时区问题就是使用标准库的dateutil工具。官方内置,值得信赖。它支持在创建日期对象的时候进行设置,更为方便:
cn=tz.gettz('Asia/Shanghai') aware_dt=datetime.datetime(2019,6,20,12,tzinfo=cn) print(aware_dt)#2019-06-2012:00:00+08:00 #时区转换(从北京时间转到纽约时间) ny=tz.gettz('America/New_York') print(aware_dt.astimezone(tz=ny))#2019-06-2000:00:00-04:00
我更喜欢这种方式。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。