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 28 Python
视觉直观感受若干常用排序算法
Apr 13 Python
Python简单删除列表中相同元素的方法示例
Jun 12 Python
对Python函数设计规范详解
Jul 19 Python
Tensorflow实现酸奶销量预测分析
Jul 19 Python
基于python二叉树的构造和打印例子
Aug 09 Python
Pycharm小白级简单使用教程
Jan 08 Python
查看keras的默认backend实现方式
Jun 19 Python
python打开文件的方式有哪些
Jun 29 Python
python简单利用字典破解zip文件口令
Sep 07 Python
利用Python将图片中扭曲矩形的复原
Sep 07 Python
pytorch finetuning 自己的图片进行训练操作
Jun 05 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+mysql事务rollback&commit示例
2010/02/08 PHP
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
jQuery 树形结构的选择器
2010/02/15 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
详谈innerHTML innerText的使用和区别
2017/08/18 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
一步步教会你微信小程序的登录鉴权
2018/04/09 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
2018/07/31 Javascript
详解js加减乘除精确计算
2019/03/19 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
angular组件间通讯的实现方法示例
2020/05/07 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
Python装饰器用法实例分析
2019/01/14 Python
python gdal安装与简单使用
2019/08/01 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
Python3 利用face_recognition实现人脸识别的方法
2020/03/13 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
Timberland俄罗斯官方网上商店:全球领先的户外品牌
2020/03/15 全球购物
Oracle性能调优原则
2012/05/03 面试题
教导处工作制度
2014/01/18 职场文书
代理商会议邀请函
2014/01/27 职场文书
温馨提示标语
2014/06/26 职场文书
在职员工证明书
2014/09/19 职场文书
2014年教师工作总结
2014/11/10 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
八年级上册语文教学计划
2015/01/22 职场文书
南京导游词
2015/02/03 职场文书
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL