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入门教程
Feb 08 Python
python使用win32com在百度空间插入html元素示例
Feb 20 Python
基于scrapy实现的简单蜘蛛采集程序
Apr 17 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
Jan 04 Python
Django自定义过滤器定义与用法示例
Mar 22 Python
Python实现聊天机器人的示例代码
Jul 09 Python
python中将zip压缩包转为gz.tar的方法
Oct 18 Python
Django中的ajax请求
Oct 19 Python
Django 路由控制的实现代码
Nov 08 Python
基于OpenCV python3实现证件照换背景的方法
Mar 22 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
Jul 22 Python
使用OpenCV circle函数图像上画圆的示例代码
Dec 27 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
Search File Contents PHP 搜索目录文本内容的代码
2010/02/21 PHP
php 文件缓存函数
2011/10/08 PHP
Javascript与PHP验证用户输入URL地址是否正确
2014/10/09 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
jQuery学习笔记 更改jQuery对象
2012/09/19 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
jquery replace方法去空格
2017/05/08 jQuery
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
vue+SSM实现验证码功能
2018/12/07 Javascript
微信小程序日历/日期选择插件使用方法详解
2018/12/28 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
[41:08]TNC vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python 变量类型及命名规则介绍
2013/06/08 Python
python输出决策树图形的例子
2019/08/09 Python
Python实现自定义读写分离代码实例
2019/11/16 Python
nginx搭建基于python的web环境的实现步骤
2020/01/03 Python
Django更新models数据库结构步骤
2020/04/01 Python
python 如何快速复制序列
2020/09/07 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
Django Form常用功能及代码示例
2020/10/13 Python
全球立体声:World Wide Stereo
2018/09/29 全球购物
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
SOA的常见陷阱或者误解是什么
2014/10/05 面试题
师范大学毕业自我鉴定
2013/11/21 职场文书
打架检讨书400字
2014/01/17 职场文书
学生会招新策划书
2014/02/14 职场文书
公司合作协议书范本
2014/04/18 职场文书
学生未请假就回家检讨书
2014/09/22 职场文书
员工工作表现自我评价
2015/03/06 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python