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实现模拟按键,自动翻页看u17漫画
Mar 17 Python
python开发之tkinter实现图形随鼠标移动的方法
Nov 11 Python
Python实现的文本简单可逆加密算法示例
May 18 Python
python中使用print输出中文的方法
Jul 16 Python
Python编程flask使用页面模版的方法
Dec 28 Python
set在python里的含义和用法
Jun 24 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
pygame实现烟雨蒙蒙下彩虹雨
Nov 11 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
Jan 10 Python
详解Python 最短匹配模式
Jul 29 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 Python
Python中异常处理用法
Nov 27 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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
php学习之数据类型之间的转换代码
2011/05/29 PHP
CI框架入门示例之数据库取数据完整实现方法
2014/11/05 PHP
PHP多线程编程之管道通信实例分析
2015/03/07 PHP
详解YII关联查询
2016/01/10 PHP
Zend Framework动作助手Redirector用法实例详解
2016/03/05 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
php实现的顺序线性表示例
2019/05/04 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
jquery实现用户打分评分特效
2015/05/28 Javascript
js实现图片上传并正常显示
2015/12/19 Javascript
ionic隐藏tabs的方法
2016/08/29 Javascript
js两种拼接字符串的简单方法(必看)
2016/09/02 Javascript
JS实现的幻灯片切换显示效果
2016/09/07 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
2018/12/30 Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
2019/03/20 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
python定时检查启动某个exe程序适合检测exe是否挂了
2013/01/21 Python
python fabric使用笔记
2015/05/09 Python
不要用强制方法杀掉python线程
2017/02/26 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
python编程测试电脑开启最大线程数实例代码
2018/02/09 Python
python实现requests发送/上传多个文件的示例
2018/06/04 Python
python批量从es取数据的方法(文档数超过10000)
2018/12/27 Python
浅谈pymysql查询语句中带有in时传递参数的问题
2020/06/05 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
CSS3教程(1):什么是CSS3
2009/04/02 HTML / CSS
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
Java平台和其他软件平台有什么不同
2015/06/05 面试题
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
2014年公路养护工作总结
2014/12/04 职场文书
大学辅导员述职报告
2015/01/10 职场文书