PYTHON中的时区处理,LMT差6分钟的问题解决
问题:
在python中,时间要做本地化,可以用pytz模块获取时区对象(datetime.timezone),如果用django的话,django.utils.timezone中的get_default_timezone等方法也是调用了pytz返回时区对象的。
而pytz模块中,中国的时区有几个,通常都是选择’Asia/Shanghai’ 这个时区,而这个上海的时区对象,是个LMT对象,即本地平均时间,跟标准的东八区时间差了6分钟,它实际上代表了上海日出日落的地理时间。
那么如果我们直接用这个时区,调用datetime.replace(),修改时区信息,就会导致时间差6分钟
>>> import pytz
>>> from datetime import datetime
>>> from django.utils import timezone
>>> pytz.all_timezones
[… 'Asia/Shanghai’, ...]
>>> pytz.timezone(‘Asia/Shanghai’)
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
>>> dt = datetime.now()
datetime.datetime(2020, 9, 25, 8, 26, 23, 589608)
>>> dt.replace(tzinfo=tz)
datetime.datetime(2020, 9, 25, 8, 26, 23, 589608, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)
>>> print(dt.replace(tzinfo=tz)) # replace 的问题,时区不对
2020-09-25 08:26:23.589608+08:06
>>> dt.astimezone(tz)
datetime.datetime(2020, 9, 25, 8, 26, 23, 589608, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
>>> print(dt.astimezone(tz)) # 正确的结果
2020-09-25 08:26:23.589608+08:00
解决方法:
1、给无时区的时间加本地时区, 使用 tz.localize(t)
>>> dt = datetime.strptime('2020-10-01 08:20:00', '%Y-%m-%d %H:%M:%S')
datetime.datetime(2020, 10, 1, 8, 20)
>>> tz = timezone.get_default_timezone()
>>> tz.localize(dt)
datetime.datetime(2020, 10, 1, 8, 20, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
>>> dt.strftime('%Y-%m-%d %H:%M:%S%z')
2020-10-01 08:20:00+0800
2、给有时区的时间转换时区, 使用 t.astimezone(tz)
>>> dt = datetime.strptime('2020-10-01 08:20:00+0800', '%Y-%m-%d %H:%M:%S%z')
datetime.datetime(2020, 10, 1, 8, 20, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))
>>> dt.astimezone(timezone.utc)
datetime.datetime(2020, 10, 1, 0, 20, tzinfo=<UTC>)
>>> tz = timezone.get_default_timezone()
>>> dt.astimezone(tz)
datetime.datetime(2020, 10, 1, 8, 20, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
PS:日期和时间合并,指定时区的方法
>>> dt = datetime.now()
datetime.datetime(2020, 9, 25, 9, 11, 53, 221663)
>>> d = dt.date()
datetime.date(2020, 9, 25)
>>> t = dt.time()
datetime.time(9, 11, 53, 221663)
>>> datetime.combine(d, t)
datetime.datetime(2020, 9, 25, 9, 11, 53, 221663)
>>> tz = timezone.get_default_timezone()
>>> datetime.combine(d, t, tzinfo=tz) # 错误的
datetime.datetime(2020, 9, 25, 9, 11, 53, 221663, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)
>>> tz.localize(datetime.combine(d, t)) # 正解
datetime.datetime(2020, 9, 25, 9, 11, 53, 221663, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
参考文档
https://blog.csdn.net/ronon77/article/details/84793493
https://tech.glowing.com/cn/dealing-with-timezone-in-python/
PYTHON中的时区处理,LMT差6分钟的问题解决相关推荐
- Python中出现:AttributeError: module 'numpy' has no attribute 'dtype'问题解决
QUESTION:Python中出现:AttributeError: module 'numpy' has no attribute 'dtype'问题解决 ANWSER: 这个问题可是困扰了我一天的 ...
- 计算机系统时间的修复,电脑中设置时间同步修复时间老是差几分钟的操作
很多的小伙伴在休闲的时候都是很喜欢玩开通不同的呈现出来设置我们的电脑的,那在电脑中对于系统提示的问题时间总是不对的情况不显示的情况我们应该怎么办呢,对于这个疑问的情况不了解的,今天小编就俩跟大家分享一 ...
- python中cgi到底是什么_十分钟搞懂什么是CGI(转)
原文:CGI Made Really Easy,在翻译的过程中,我增加了一些我在学习过程中找到的更合适的资料,和自己的一些理解.不能算是严格的翻译文章,应该算是我的看这篇文章的过程的随笔吧. CGI真 ...
- python判断是相邻数字,检查Python中相邻数字的绝对差之和是否为素数
假设我们有一个数字n.我们必须检查相邻数字对的绝对差之和是否为质数. 因此,如果输入类似于n = 574,则输出将为True,例如| 5-7 |.+ | 7-4 | = 5,这是素数. 为了解决这个问 ...
- python中的dict函数什么意思_3分钟搞懂Python中dict函数的含义是什么
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例子,假设要根据同学的名字查找对应的 ...
- Python中setdefault,deepcopy,copy函数(一分钟读懂)
setdefault() setdefault() 函数 dict.setdefault(key, default=None) 使用方法 字典变量.serdefault('键名',"值&qu ...
- python时区转换_在python 不同时区之间的差值与转换方法
之前有个程序,里面有个时间部分是按照国内时区,也就是东八区,来写的,程序中定义了北京时间2点到八点进行检查:后面程序在国外机器上,例如说韩国,欧美等,执行的时候发现会有时间上的问题,因为获取的是机器的 ...
- 如何在python中识别未知的日期时区时区
本文翻译自:How to make an unaware datetime timezone aware in python What I need to do 我需要做什么 I have a tim ...
- python中求差的函数_python3函数取差是什么?如何写代码?
我们在数学中进行加减运算,两个数相减就可以得到差.今天小编就带来一个新问题,函数取差.有的小伙伴会很困惑,函数是一群英文使用,又不是数字怎么还能进行取差呢?这里也算是学习python有趣的地方,函数取 ...
最新文章
- windows下live555+rtsp+ffmpeg媒体源,nginx+rtmp转发服务器,vlc播放rtmp媒体流
- win10光驱位连接计算机,windows10不能识别光驱位硬盘
- kafka 异常:ERROR Failed to clean up log for __consumer_offsets-30 in dir /tmp/kafka-logs due to IOExce
- C语言 __DATE__ - C语言零基础入门教程
- react判断点击位置是否为组件内,实现点击外部触发组件内事件
- 永恒之塔 java_AionChs
- graph slam tutorial :从推导到应用3
- Docker禁令生效,开始限制所有被美国列入实体清单的公司和个人使用Docker
- mysql二进制日志开启方法_mysql中如何开启binlog?开启二进制日志文件?binary log?
- mysql中连接运算符_MySQL的运算符
- 制作.rpgsave存档修改器
- 如何从当前文件夹直接打开cmd快捷键
- mysql 计算农历_SQL农历转换函数
- 海外邮件收发阻碍多?网易企业邮箱为您保驾护航【网易企业邮箱怎么申请】
- 光电耦合器简单介绍以及作用
- oracle 11g64 位 安装文件
- 我们仨——快乐的湘军
- 照片处理:PS三步轻松实现背景虚化
- IntellIdea 注册码
- swalAlert一些简单例子
热门文章
- Seventh season twenty-third episode,Monica is gonna have a baby???????
- 「译」Liftoff:V8 引擎中全新的 WebAssembly baseline 编译器
- 乐优商城源码/数据库及笔记总结
- 中国科学发展的关键点在哪里?这位院士一连提出12个问题
- 2019 AI/CV 顶会时间表
- iOS端屏幕录制开发指南
- 玩电脑游戏为啥“上瘾”
- 数学分析教程史济怀练习15.3
- J2EE开发平台:Eclipse之Appfuse浅析
- keepalived版本引发故障解决分析