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 相关文章推荐
python绘图库Matplotlib的安装
Jul 03 Python
跟老齐学Python之有容乃大的list(2)
Sep 15 Python
python实现去除下载电影和电视剧文件名中的多余字符的方法
Sep 23 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
Jul 07 Python
解决tensorflow模型参数保存和加载的问题
Jul 26 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
Python插入Elasticsearch操作方法解析
Jan 19 Python
关于tf.TFRecordReader()函数的用法解析
Feb 17 Python
Python日期格式和字符串格式相互转换的方法
Feb 18 Python
vscode配置anaconda3的方法步骤
Aug 08 Python
Python自动化测试基础必备知识点总结
Feb 07 Python
python数据处理之Pandas类型转换
Apr 28 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
PHP函数utf8转gb2312编码
2006/12/21 PHP
探讨捕获php错误信息方法的详解
2013/06/09 PHP
浅谈php中mysql与mysqli的区别分析
2013/06/10 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
2013/11/26 PHP
php的zip解压缩类pclzip使用示例
2014/03/14 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
如何用js控制css中的float的代码
2007/08/16 Javascript
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
js鼠标移动时禁止选中文字
2017/02/19 Javascript
JS闭包用法实例分析
2017/03/27 Javascript
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
在NPM发布自己造的轮子的方法步骤
2019/03/09 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
2020/04/08 Javascript
python实现定制交互式命令行的方法
2014/07/03 Python
Python学习笔记之os模块使用总结
2014/11/03 Python
详解Python当中的字符串和编码
2015/04/25 Python
python实现RSA加密(解密)算法
2016/02/17 Python
Python实现文件复制删除
2016/04/19 Python
Python基于列表list实现的CRUD操作功能示例
2018/01/05 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
详解Python3之数据指纹MD5校验与对比
2019/06/11 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
2020/04/10 Python
HTML5里的placeholder属性使用实例和美化显示效果的方法
2014/04/23 HTML / CSS
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
优秀毕业生事迹材料
2014/02/12 职场文书
校园环保建议书
2014/05/14 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
AI:如何训练机器学习的模型
2021/04/16 Python
前端vue+express实现文件的上传下载示例
2022/02/18 Vue.js