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使用三角迭代计算圆周率PI的方法
Mar 20 Python
详解 Python 读写XML文件的实例
Aug 02 Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 Python
python 自动批量打开网页的示例
Feb 21 Python
python实现合并多个list及合并多个django QuerySet的方法示例
Jun 11 Python
python字典一键多值实例代码分享
Jun 14 Python
这可能是最好玩的python GUI入门实例(推荐)
Jul 19 Python
Django框架下静态模板的继承操作示例
Nov 08 Python
python3中rank函数的用法
Nov 27 Python
python3正则模块re的使用方法详解
Feb 11 Python
python标准库OS模块详解
Mar 10 Python
python3爬虫GIL修改多线程实例讲解
Nov 24 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
在线增减.htpasswd内的用户
2006/10/09 PHP
特详细的PHPMYADMIN简明安装教程
2008/08/01 PHP
php Smarty 字符比较代码
2011/02/27 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
使用jQuery validate 验证注册表单实例演示
2013/03/25 Javascript
jquery实现预览提交的表单代码分享
2014/05/21 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
2015/03/09 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
jQuery事件绑定方法学习总结(推荐)
2016/11/21 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
node.js中cluster的使用教程
2017/06/09 Javascript
JavaScript 中调用 Kotlin 方法实例详解
2017/06/09 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
解决ng-repeat产生的ng-model中取不到值的问题
2018/10/02 Javascript
Node.js设置定时任务之node-schedule模块的使用详解
2020/04/28 Javascript
使用nodejs实现JSON文件自动转Excel的工具(推荐)
2020/06/24 NodeJs
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
用python写的一个wordpress的采集程序
2016/02/27 Python
对python:print打印时加u的含义详解
2018/12/15 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
在python image 中安装中文字体的实现方法
2019/08/22 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
HTML5 对各个标签的定义与规定:body的介绍
2012/06/21 HTML / CSS
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
戴尔新西兰官网:Dell New Zealand
2020/01/07 全球购物
总经理助理工作职责
2014/02/06 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
春季运动会加油词
2015/07/18 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书
导游词之泉州崇武古城
2019/12/20 职场文书