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获取Linux系统的各种信息
Jul 10 Python
纯Python开发的nosql数据库CodernityDB介绍和使用实例
Oct 23 Python
进一步了解Python中的XML 工具
Apr 13 Python
python学习之第三方包安装方法(两种方法)
Jul 30 Python
详细解读tornado协程(coroutine)原理
Jan 15 Python
python 将json数据提取转化为txt的方法
Oct 26 Python
python 实现敏感词过滤的方法
Jan 21 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
Jun 05 Python
在macOS上搭建python环境的实现方法
Aug 13 Python
Python面向对象编程基础实例分析
Jan 17 Python
python tqdm实现进度条的示例代码
Nov 10 Python
python编程学习使用管道Pipe编写优化代码
Nov 20 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
第九节 绑定 [9]
2006/10/09 PHP
php在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
Laravel 5 框架入门(四)完结篇
2015/04/09 PHP
PHP中类的继承和用法实例分析
2016/05/24 PHP
php生成与读取excel文件
2016/10/14 PHP
通过修改referer下载文件的方法
2008/05/11 Javascript
JavaScript 创建对象和构造类实现代码
2009/07/30 Javascript
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
EasySlider 基于jQuery功能强大简单易用的滑动门插件
2010/06/11 Javascript
JS模块与命名空间的介绍
2013/03/22 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
2016/03/11 Javascript
Jquery删除css属性的简单方法
2016/12/04 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
2018/03/07 Javascript
javaScript中indexOf用法技巧
2019/11/26 Javascript
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
在django中使用自定义标签实现分页功能
2017/07/04 Python
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
2018/03/02 Python
Python+OpenCV实现车牌字符分割和识别
2018/03/31 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
python实现五子棋小游戏
2020/03/25 Python
Python button选取本地图片并显示的实例
2019/06/13 Python
python判断是空的实例分享
2020/07/06 Python
ASOS西班牙官网:英国在线时尚和美容零售商
2020/01/10 全球购物
数学专业推荐信范文
2013/11/21 职场文书
大四学生思想汇报
2014/01/13 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
在教室放鞭炮的检讨书
2014/09/28 职场文书
2015国庆节感想
2015/08/04 职场文书
如何写一份成功的商业计划书
2019/06/25 职场文书
员工工作失职检讨书范文!
2019/07/03 职场文书