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获取本机外网ip的方法
Apr 15 Python
python学习之第三方包安装方法(两种方法)
Jul 30 Python
python实现RSA加密(解密)算法
Feb 17 Python
MySQL适配器PyMySQL详解
Sep 20 Python
Python设置在shell脚本中自动补全功能的方法
Jun 25 Python
Python3 安装PyQt5及exe打包图文教程
Jan 08 Python
python 并发编程 阻塞IO模型原理解析
Aug 20 Python
PyCharm使用Docker镜像搭建Python开发环境
Dec 26 Python
使用pickle存储数据dump 和 load实例讲解
Dec 30 Python
Django操作session 的方法
Mar 09 Python
Python使用pyyaml模块处理yaml数据
Apr 14 Python
Python实现Word文档转换Markdown的示例
Dec 22 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过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
PHP实现用session来实现记录用户登陆信息
2018/10/15 PHP
JavaScript脚本语言在网页中的简单应用
2007/05/13 Javascript
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
微信小程序实现皮肤功能(夜间模式)
2017/06/18 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
angular6的table组件开发的实现示例
2018/12/26 Javascript
浅谈webpack 四个核心概念之Entry
2019/06/12 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案
2020/08/13 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
python实现扫描日志关键字的示例
2018/04/28 Python
利用python的socket发送http(s)请求方法示例
2018/05/07 Python
Python3爬虫全国地址信息
2019/01/05 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
Python中的With语句的使用及原理
2020/07/29 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
python接口自动化框架实战
2020/12/23 Python
Python datetime模块的使用示例
2021/02/02 Python
密封类可以有虚函数吗
2014/08/11 面试题
公司门卫管理制度
2014/02/01 职场文书
物流管理专业毕业生求职信
2014/03/23 职场文书
企业授权委托书范本
2014/04/02 职场文书
小学语文复习计划
2015/01/19 职场文书
建国大业观后感600字
2015/06/01 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
Python基础之条件语句详解
2021/06/16 Python