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遍历类中所有成员的方法
Mar 18 Python
解决matplotlib库show()方法不显示图片的问题
May 24 Python
在Python中使用Neo4j的方法
Mar 14 Python
Python第三方库face_recognition在windows上的安装过程
May 03 Python
PyCharm如何导入python项目的方法
Feb 06 Python
pandas分批读取大数据集教程
Jun 06 Python
Keras—embedding嵌入层的用法详解
Jun 10 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
Sep 09 Python
Python爬虫代理池搭建的方法步骤
Sep 28 Python
在pycharm创建scrapy项目的实现步骤
Dec 01 Python
Python爬虫实现selenium处理iframe作用域问题
Jan 27 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
Feb 16 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
亚洲咖啡有什么?亚洲咖啡产地介绍 亚洲咖啡有什么特点?
2021/03/05 新手入门
PHP新手上路(十)
2006/10/09 PHP
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
脚本安需导入(装载)的三种模式的对比
2007/06/24 Javascript
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
JQuery页面地址处理插件jqURL详解
2015/05/03 Javascript
javascript匀速运动实现方法分析
2016/01/08 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
2016/05/26 Javascript
JavaScript必知必会(十) call apply bind的用法说明
2016/06/08 Javascript
BOM系列第三篇之定时器应用(时钟、倒计时、秒表和闹钟)
2016/08/17 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
2018/05/31 jQuery
服务端预渲染之Nuxt(使用篇)
2019/04/08 Javascript
Vue源码探究之虚拟节点的实现
2019/04/17 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
[01:42]DOTA2 – 虚无之灵
2019/08/25 DOTA
Flask框架中密码的加盐哈希加密和验证功能的用法详解
2016/06/07 Python
Python使用SocketServer模块编写基本服务器程序的教程
2016/07/12 Python
tensorflow输出权重值和偏差的方法
2018/02/10 Python
python调用百度语音REST API
2018/08/30 Python
python数据分析:关键字提取方式
2020/02/24 Python
css3的图形3d翻转效果应用示例
2014/04/08 HTML / CSS
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
影子教师研修方案
2014/06/14 职场文书
八荣八耻的活动方案
2014/08/16 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
三方股份合作协议书
2014/10/13 职场文书
付款证明格式范文
2015/06/19 职场文书
汽车销售员工作总结
2015/08/12 职场文书
CSS3实现三角形不断放大效果
2021/04/13 HTML / CSS
python 进阶学习之python装饰器小结
2021/09/04 Python