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使用cPickle模块序列化实例
Sep 25 Python
举例详解Python中yield生成器的用法
Aug 05 Python
python实现txt文件格式转换为arff格式
May 31 Python
对Python 3.5拼接列表的新语法详解
Nov 08 Python
python2.7 安装pip的方法步骤(管用)
May 05 Python
树莓派实现移动拍照
Jun 22 Python
详解python实现小波变换的一个简单例子
Jul 18 Python
使用python写的opencv实时监测和解析二维码和条形码
Aug 14 Python
Python Des加密解密如何实现软件注册码机器码
Jan 08 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
Jan 25 Python
TensorFlow加载模型时出错的解决方式
Feb 06 Python
Python基础知识学习之类的继承
May 31 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 文件缓存函数
2011/10/08 PHP
php读取图片内容并输出到浏览器的实现代码
2013/08/08 PHP
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
JQuery操作textarea,input,select,checkbox方法
2015/09/02 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
2016/03/04 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
2016/12/08 Javascript
函数四种调用模式以及其中的this指向
2017/01/16 Javascript
基于jQuery和CSS3实现APPLE TV海报视差效果
2017/06/16 jQuery
vue绑定设置属性的多种方式(5)
2017/08/16 Javascript
jquery实现直播弹幕效果
2019/11/28 jQuery
推荐几个不错的console调试技巧实现
2019/12/20 Javascript
python3如何将docx转换成pdf文件
2018/03/23 Python
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
python3实现绘制二维点图
2019/12/04 Python
Python StringIO如何在内存中读写str
2020/01/07 Python
超全Python图像处理讲解(多模块实现)
2020/04/13 Python
python爬虫请求头设置代码
2020/07/28 Python
浅谈Python 钉钉报警必备知识系统讲解
2020/08/17 Python
Django权限控制的使用
2021/01/07 Python
Python 中如何使用 virtualenv 管理虚拟环境
2021/01/21 Python
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
英国袜子店:Sock Shop
2017/01/11 全球购物
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
数控机械专业个人的自我评价
2014/01/02 职场文书
关于教师节的广播稿
2014/09/10 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
初中政治教师教学反思
2016/02/23 职场文书
教你用python实现12306余票查询
2021/06/30 Python
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB
SQLServer常见数学函数梳理总结
2022/08/05 MySQL