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下的常用下载安装工具pip的安装方法
Nov 13 Python
Python读写txt文本文件的操作方法全解析
Jun 26 Python
Python编程实现的简单Web服务器示例
Jun 22 Python
Python 实现购物商城,含有用户入口和商家入口的示例
Sep 15 Python
利用python求解物理学中的双弹簧质能系统详解
Sep 29 Python
Python温度转换实例分析
Jan 17 Python
如何用Python实现简单的Markdown转换器
Jul 16 Python
Python 元组操作总结
Sep 18 Python
python DataFrame转dict字典过程详解
Dec 26 Python
Python 实现向word(docx)中输出
Feb 13 Python
Python通过socketserver处理多个链接
Mar 18 Python
Python3读写ini配置文件的示例
Nov 06 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
php Smarty date_format [格式化时间日期]
2010/03/15 PHP
Zend studio文件注释模板设置方法
2013/09/29 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
PHP运用foreach神奇的转换数组(实例讲解)
2018/02/01 PHP
php解压缩zip和rar压缩包文件的方法
2019/07/10 PHP
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
jQuery实现新消息在网页标题闪烁提示
2015/06/23 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
jquery网页日历显示控件calendar3.1使用详解
2016/11/24 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
学习使用jQuery表单验证插件和日历插件
2017/02/13 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
JS分页的实现(同步与异步)
2017/09/16 Javascript
Node.js Buffer用法解读
2018/05/18 Javascript
JavaScript函数IIFE使用详解
2019/10/21 Javascript
原生js实现拖拽移动与缩放效果
2020/08/24 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
2020/09/17 Javascript
在Python中使用mongoengine操作MongoDB教程
2015/04/24 Python
python NumPy ndarray二维数组 按照行列求平均实例
2019/11/26 Python
python爬虫添加请求头代码实例
2019/12/28 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
python tqdm实现进度条的示例代码
2020/11/10 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
python switch 实现多分支选择功能
2020/12/21 Python
HEMA英国:荷兰原创设计
2018/08/28 全球购物
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
Linux常见面试题
2016/10/04 面试题
计算机工程学院个人求职信
2013/10/05 职场文书
行政专员的岗位职责
2014/03/10 职场文书
在职员工证明书
2014/09/19 职场文书
2014年生活老师工作总结
2014/12/23 职场文书
销售内勤岗位职责
2015/02/10 职场文书
vue响应式原理与双向数据的深入解析
2021/06/04 Vue.js
Python开发简易五子棋小游戏
2022/05/02 Python