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/

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值