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输出一个杨辉三角的例子
Jun 13 Python
python安装cx_Oracle模块常见问题与解决方法
Feb 21 Python
python利用不到一百行代码实现一个小siri
Mar 02 Python
Python列表和元组的定义与使用操作示例
Jul 26 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
Feb 21 Python
Python使用Django实现博客系统完整版
Sep 29 Python
tornado+celery的简单使用详解
Dec 21 Python
使用python接受tgam的脑波数据实例
Apr 09 Python
判断Threading.start新线程是否执行完毕的实例
May 02 Python
Python验证码截取识别代码实例
May 16 Python
python中有函数重载吗
May 28 Python
python 使用elasticsearch 实现翻页的三种方式
Jul 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使用array_rand()函数从数组中随机选择一个或多个元素
2014/04/28 PHP
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
php中数字、字符与对象判断函数用法实例
2014/11/26 PHP
php返回字符串中所有单词的方法
2015/03/09 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
2015/08/08 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
php 使用mpdf实现指定字段配置字体样式的方法
2019/07/29 PHP
基于jquery的web页面日期格式化插件
2011/11/15 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
Angular设置别名alias的方法
2018/11/08 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
jQuery实现移动端图片上传预览组件的方法分析
2020/05/01 jQuery
[50:44]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第二场 2月22日
2021/03/11 DOTA
python采用requests库模拟登录和抓取数据的简单示例
2014/07/05 Python
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
Python3中详解fabfile的编写
2018/06/24 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
python 堆和优先队列的使用详解
2019/03/05 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
2019/12/13 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
2020/01/18 Python
Python networkx包的实现
2020/02/14 Python
django 读取图片到页面实例
2020/03/27 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
特罗佩亚包官方网站:Tropea
2017/01/03 全球购物
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
芭比波朗加拿大官方网站:Bobbi Brown Cosmetics CA
2020/11/05 全球购物
奉献演讲稿范文
2014/05/21 职场文书
设计师求职信
2014/07/01 职场文书
会议主持词开场白
2015/05/28 职场文书
学生会副主席竞选稿
2015/11/19 职场文书
Pyqt5将多个类组合在一个界面显示的完整示例
2021/09/04 Python