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字符串过滤性能比较5种方法
Jun 22 Python
Python编程之微信推送模板消息功能示例
Aug 21 Python
Python探索之SocketServer详解
Oct 28 Python
Python内置函数——__import__ 的使用方法
Nov 24 Python
在matplotlib的图中设置中文标签的方法
Dec 13 Python
运用Python的webbrowser实现定时打开特定网页
Feb 21 Python
使用Python实现将list中的每一项的首字母大写
Jun 11 Python
python使用 cx_Oracle 模块进行查询操作示例
Nov 28 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
Mar 08 Python
使用PyQt5实现图片查看器的示例代码
Apr 21 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
Jun 02 Python
详解pandas赋值失败问题解决
Nov 29 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连接access数据库
2015/03/27 PHP
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
ExtJs Excel导出并下载IIS服务器端遇到的问题
2011/09/16 Javascript
js获取TreeView控件选中节点的Text和Value值的方法
2012/11/24 Javascript
jQuery对Select的操作大集合(收藏)
2013/12/28 Javascript
Javascript中的异步编程规范Promises/A详细介绍
2014/06/06 Javascript
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
JavaScript面向对象中接口实现方法详解
2019/07/24 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
python中的列表推导浅析
2014/04/26 Python
vscode 远程调试python的方法
2017/12/01 Python
Python使用sort和class实现的多级排序功能示例
2018/08/15 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
2019/04/11 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
2019/06/28 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
基于python plotly交互式图表大全
2019/12/07 Python
python 项目目录结构设置
2020/02/14 Python
Python3实现飞机大战游戏
2020/04/24 Python
TensorFlow固化模型的实现操作
2020/05/26 Python
Python创建临时文件和文件夹
2020/08/05 Python
python 代码运行时间获取方式详解
2020/09/18 Python
amazeui模态框弹出后立马消失并刷新页面
2020/08/19 HTML / CSS
英国儿童图书网站:Scholastic
2017/03/26 全球购物
德国二手设计师时装和复古时装跳蚤市场:Mädchenflohmarkt
2020/11/09 全球购物
科颜氏香港官方网店:Kiehl’s香港
2021/03/07 全球购物
影视艺术学院毕业生自荐信
2013/11/13 职场文书
个人主要事迹材料
2014/08/26 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
python实现批量提取指定文件夹下同类型文件
2021/04/05 Python
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python