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中下划线的使用方法
Mar 27 Python
Python中文分词实现方法(安装pymmseg)
Jun 14 Python
简单讲解Python编程中namedtuple类的用法
Jun 21 Python
Python中的迭代器与生成器高级用法解析
Jun 28 Python
Python实现将doc转化pdf格式文档的方法
Jan 19 Python
python如何在列表、字典中筛选数据
Mar 19 Python
学生信息管理系统python版
Oct 17 Python
Python中Numpy mat的使用详解
May 24 Python
python利用多种方式来统计词频(单词个数)
May 27 Python
python threading和multiprocessing模块基本用法实例分析
Jul 25 Python
python如何从文件读取数据及解析
Sep 19 Python
Python 安装 virturalenv 虚拟环境的教程详解
Feb 21 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
实用函数9
2007/11/08 PHP
php email邮箱正则
2008/10/08 PHP
php 图像函数大举例(非原创)
2009/06/20 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
PHP合并discuz用户脚本的方法
2015/08/04 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
js multiple全选与取消全选实现代码
2012/12/04 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
JavaScript实现简单的时钟实例代码
2013/11/23 Javascript
js判断ie版本号的简单实现代码
2014/03/05 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
2014/12/19 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
2015/03/25 Javascript
Bootstrap精简教程
2015/11/27 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
微信小程序-getUserInfo回调的实例详解
2017/10/27 Javascript
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
如何利用vue实现波谱拟合详解
2020/11/05 Javascript
Python中type的构造函数参数含义说明
2015/06/21 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
Python字符串、整数、和浮点型数相互转换实例
2018/08/04 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
Python3实现腾讯云OCR识别
2018/11/27 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
2019/04/16 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
基于python代码批量处理图片resize
2020/06/04 Python
Python 实现键盘鼠标按键模拟
2020/11/18 Python
HTML5 device access 设备访问详解
2018/05/24 HTML / CSS
英国绿色商店:Natural Collection
2019/05/03 全球购物
应届生会计电算化求职信
2013/10/03 职场文书
集团薪酬管理制度
2014/01/13 职场文书
2016幼儿园中班开学寄语
2015/12/03 职场文书