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 相关文章推荐
查看Django和flask版本的方法
May 14 Python
修复 Django migration 时遇到的问题解决
Jun 14 Python
Python发送邮件测试报告操作实例详解
Dec 08 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
Python饼状图的绘制实例
Jan 15 Python
python os模块简单应用示例
May 23 Python
使用WingPro 7 设置Python路径的方法
Jul 24 Python
Python学习笔记之字符串和字符串方法实例详解
Aug 22 Python
python网络爬虫 Scrapy中selenium用法详解
Sep 28 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
Jun 03 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
Dec 17 Python
python实现黄金分割法的示例代码
Apr 28 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
用IE远程创建Mysql数据库的简易程序
2006/10/09 PHP
php fsockopen伪造post与get方法的详解
2013/06/14 PHP
Yii实现文章列表置顶功能示例
2016/10/18 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
PHP正则匹配到2个字符串之间的内容方法
2018/12/24 PHP
jQuery 位置插件
2008/12/25 Javascript
面向对象的编程思想在javascript中的运用上部
2009/11/20 Javascript
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
javascript 禁用IE工具栏,导航栏等等实现代码
2013/04/01 Javascript
js 弹出框只弹一次(二次修改之后的)
2013/11/26 Javascript
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
浅谈在js传递参数中含加号(+)的处理方式
2016/10/11 Javascript
Javascript下拉刷新的简单实现
2017/02/14 Javascript
vue2.x+webpack快速搭建前端项目框架详解
2017/11/30 Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
2018/06/28 Javascript
Vue-cli配置打包文件本地使用的教程图解
2018/08/02 Javascript
微信小程序多音频播放进度条问题
2018/08/28 Javascript
基于VUE的v-charts的曲线显示功能
2019/10/01 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
[00:12]DAC2018 Miracle-站上中单舞台,他能否再写奇迹?
2018/04/06 DOTA
深入解析Python中的集合类型操作符
2015/08/19 Python
Windows下Python使用Pandas模块操作Excel文件的教程
2016/05/31 Python
Python动刷新抢12306火车票的代码(附源码)
2018/01/24 Python
Django forms组件的使用教程
2018/10/08 Python
详解H5本地储存Web Storage
2017/07/03 HTML / CSS
Maje德国官网:法国女性成衣品牌
2017/02/10 全球购物
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
编写类String 的构造函数、析构函数和赋值函数
2012/09/09 面试题
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
go设置多个GOPATH的方式
2021/05/05 Golang
Java8中Stream的一些神操作
2021/11/02 Java/Android