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中使用pyhook实现键盘监控的例子
Jul 18 Python
Python实现翻转数组功能示例
Jan 12 Python
Python3数据库操作包pymysql的操作方法
Jul 16 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
python算法题 链表反转详解
Jul 02 Python
解决Python3 控制台输出InsecureRequestWarning问题
Jul 15 Python
Python进度条的制作代码实例
Aug 31 Python
Python+Appium实现自动化测试的使用步骤
Mar 24 Python
在django admin中配置搜索域是一个外键时的处理方法
May 20 Python
python如何删除列为空的行
Jul 17 Python
Python语言规范之Pylint的详细用法
Jun 24 Python
python接口测试返回数据为字典取值方式
Feb 12 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 PDO中文乱码解决办法
2009/07/20 PHP
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
php文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
PHP开发Apache服务器配置
2015/07/15 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
让textarea自动调整大小的js代码
2011/04/12 Javascript
js工具方法弹出蒙版
2013/05/08 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
老生常谈Javascript中的原型和this指针
2016/10/09 Javascript
使用Python编写提取日志中的中文的脚本的方法
2015/04/30 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
python对象及面向对象技术详解
2016/07/19 Python
python fabric实现远程部署
2017/01/05 Python
python安装Scrapy图文教程
2017/08/14 Python
Python实现的矩阵类实例
2017/08/22 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
python字典嵌套字典的情况下找到某个key的value详解
2019/07/10 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
Python模拟登录和登录跳转的参考示例
2020/10/30 Python
Pycharm安装python库的方法
2020/11/24 Python
上海方立数码笔试题
2013/10/18 面试题
中层干部岗位职责
2013/12/18 职场文书
美术毕业生求职信
2014/02/25 职场文书
药品业务员岗位职责
2014/04/17 职场文书
供货协议书
2014/04/22 职场文书
保险公司演讲稿
2014/09/02 职场文书
办理房产过户的委托书
2014/09/14 职场文书
导游词之天津盘山
2019/11/01 职场文书
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript