pytz格式化北京时间多出6分钟问题的解决方法


Posted in Python onJune 21, 2019

起步

在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

我更喜欢这种方式。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
在Django的模板中使用认证数据的方法
Jul 23 Python
Python抓取框架Scrapy爬虫入门:页面提取
Dec 01 Python
python 列表,数组和矩阵sum的用法及区别介绍
Jun 28 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
Feb 11 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
Jun 18 Python
浅析Python与Mongodb数据库之间的操作方法
Jul 01 Python
Python企业编码生成系统总体系统设计概述
Jul 26 Python
基于Python绘制个人足迹地图
Jun 01 Python
Pytorch 高效使用GPU的操作
Jun 27 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
Nov 01 Python
selenium+headless chrome爬虫的实现示例
Jan 08 Python
Python采集壁纸并实现炫轮播
Apr 30 Python
对pyqt5之menu和action的使用详解
Jun 20 #Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 #Python
PyQt QCombobox设置行高的方法
Jun 20 #Python
PyQt QListWidget修改列表项item的行高方法
Jun 20 #Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
Jun 20 #Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
Jun 20 #Python
PyQt5 窗口切换与自定义对话框的实例
Jun 20 #Python
You might like
一个简单计数器的源代码
2006/10/09 PHP
php xml文件操作代码(一)
2009/03/20 PHP
PHP统计目录下的文件总数及代码行数(去除注释及空行)
2011/01/17 PHP
PHP session_start()问题解疑(详细介绍)
2013/07/05 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
php中引用符号(&)的使用详细介绍
2016/12/06 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
[推荐]javascript 面向对象技术基础教程
2009/03/03 Javascript
jQuery live( type, fn ) 委派事件实现
2009/10/11 Javascript
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
JS代码判断IE6,IE7,IE8,IE9的函数代码
2013/08/02 Javascript
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
微信小程序 require机制详解及实例代码
2016/12/14 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
vue 引用自定义ttf、otf、在线字体的方法
2019/05/09 Javascript
python同时给两个收件人发送邮件的方法
2015/04/30 Python
Python实现的简单hangman游戏实例
2015/06/28 Python
Django验证码的生成与使用示例
2017/05/20 Python
Python实现的简单模板引擎功能示例
2017/09/02 Python
python实现图片上添加图片
2019/11/26 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
CSS3实现的文本3D效果附图
2014/09/03 HTML / CSS
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
英国团购网站:Groupon英国
2017/11/28 全球购物
老师自我鉴定范文
2013/12/25 职场文书
幼儿园家长评语
2014/02/10 职场文书
致跳远运动员广播稿
2014/02/11 职场文书
运输服务质量承诺书
2014/03/27 职场文书
4S店售后客服自我评价
2014/04/09 职场文书
计算机系本科生求职信
2014/05/31 职场文书
小学优秀教师材料
2014/12/15 职场文书
JavaScript中的LHS和RHS分析详情
2022/04/06 Javascript