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实现的可以拷贝或剪切一个文件列表中的所有文件
Apr 30 Python
Python的字典和列表的使用中一些需要注意的地方
Apr 24 Python
Python2.x版本中cmp()方法的使用教程
May 14 Python
Python实现的归并排序算法示例
Nov 21 Python
python3中os.path模块下常用的用法总结【推荐】
Sep 16 Python
matplotlib实现热成像图colorbar和极坐标图的方法
Dec 13 Python
在python环境下运用kafka对数据进行实时传输的方法
Dec 27 Python
Python 20行简单实现有道在线翻译的详解
May 15 Python
使用pytorch和torchtext进行文本分类的实例
Jan 08 Python
python实现斗地主分牌洗牌
Jun 22 Python
Python3爬虫中Selenium的用法详解
Jul 10 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
在PHP里得到前天和昨天的日期的代码
2007/08/16 PHP
PHP不用递归遍历目录下所有文件的代码
2014/07/04 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
Mac系统下安装PHP Xdebug
2018/03/30 PHP
JavaScript中的集合及效率
2010/01/08 Javascript
JS trim去空格的最佳实践
2011/10/30 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
js内存泄露的几种情况详细探讨
2013/05/31 Javascript
jQuery过滤选择器:not()方法使用介绍
2014/04/20 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
node.js中的fs.closeSync方法使用说明
2014/12/17 Javascript
HTML+CSS+JS实现完美兼容各大浏览器的TABLE固定列
2015/04/26 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
javascript的replace方法结合正则使用实例总结
2016/06/16 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
JS实现颜色梯度与渐变效果完整实例
2016/12/30 Javascript
Angular 4.x 路由快速入门学习
2017/05/03 Javascript
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
[39:21]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.24
2019/09/10 DOTA
浅谈scrapy 的基本命令介绍
2017/06/13 Python
Python中序列的修改、散列与切片详解
2017/08/27 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
2019/08/14 Python
django使用xadmin的全局配置详解
2019/11/15 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
Springboot/Springcloud项目集成redis进行存取的过程解析
2021/12/04 Redis
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android
简单聊聊Golang中defer预计算参数
2022/03/25 Golang
HttpClient实现表单提交上传文件
2022/08/14 Java/Android