内容简介:在django框架中,用的是为什么多出了 6 分钟来?这是因为
起步
在django框架中,用的是 pytz
库处理时区问题,所以我也尝试用这个库来处理。但发现了一个奇怪的问题:
import datetime import pytz dt = datetime.datetime(2019,6,20, 12, tzinfo=pytz.timezone('Asia/Shanghai')) print(dt) # 2019-06-20 12: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-20 12:00:00 LMT+0806
LMT
即 Local Mean Time
本地时间,也就是说 '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-20 12:00:00+08:00 print(dt.strftime(fmt)) # 2019-06-20 12:00:00 CST+0800 # 或者 dt = datetime.datetime(2019,6,20, 12) print(dt.astimezone(cn_zone)) # 2019-06-20 12:00:00 CST+0800
这里推荐的还是用 astimezone
的方式,django 也是采用这种处理方式。
时区转换
以从北京时间转纽约时间为例,已知结果它们之间应该相差12小时。
dt = datetime.datetime(2019,6,20, 12) print(dt.astimezone(tz=cn_zone)) # 2019-06-20 12:00:00+08:00 print(dt.astimezone(tz=cn_zone).astimezone(ny_zone)) # 2019-06-20 12: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-20 12:00:00+08:00 # 时区转换(从北京时间转到纽约时间) ny = tz.gettz('America/New_York') print(aware_dt.astimezone(tz=ny)) # 2019-06-20 00:00:00-04:00
我更喜欢这种方式。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序员2010精华本
程序员杂志社 / 电子工业 / 2011-1 / 49.00元
《程序员(2010精华本)》主要内容:《程序员》创刊10年来,每年末编辑部精心打造的“合订本”已经形成一个品牌,得到广大读者的认可和喜爱。今年,《程序员》杂志内容再次进行了优化整合,除了每期推出的一个大型专题策划,各版块也纷纷以专题、策划的形式,将每月的重点进行了整合,让内容非常具有凝聚力,如专题篇、人物篇、实践篇等。另外杂志的版式、色彩方面也有了很大的飞跃,给读者带来耳目一新的阅读体验。一起来看看 《程序员2010精华本》 这本书的介绍吧!
HTML 压缩/解压工具
在线压缩/解压 HTML 代码
HEX CMYK 转换工具
HEX CMYK 互转工具