3.16结合时区的日期操作

问题:

解决方案:

​ 对几乎所有涉及到时区的问题,你都应该使用pytz模块,这个包提供了Olson时区数据库,它是时区的事实上的标准,在很多语言和操作系统里面都可以找到,

pytz模块一个主要用途是将datetime库创建的简单日期对象本地化,比如,下面如果表示一个芝加哥时间的示例:

from datetime import datetime
from pytz import timezone

d = datetime(2022, 12, 21, 9, 12, 0)
print(d)  # ->2022-12-21 09:12:00
central=timezone('US/Central')
loc_d=central.localize(d)
print(loc_d)  # ->2022-12-21 09:12:00-06:00

一旦日期被本地化了,它就可以以转换为其他时区的时间了,为了得到班加罗尔对应的时间,你可以这样做:

bang_d=loc_d.astimezone(timezone('Asia/Kolkata'))
print(bang_d)# ->2022-12-21 20:42:00+05:30

​ 如果你打算在本地化日期上执行计算,你需要特别注意夏令时转换和其他细节。比如,2022年,美国标准夏令时间开始于本地时间3月13日凌晨2:00(在那时,时间向前跳过一小时)。如果你正在执行本地计算,你会得到一个错误。比如:

d = datetime(2022, 12, 21, 9, 12)
central=timezone('US/Central')
loc_d=central.localize(d)
later=loc_d+timedelta(minutes=30)
print(loc_d) # ->2022-12-21 09:12:00-06:00
print(later)# ->2022-12-21 09:42:00-06:00

讨论:

​ 为了不让你被这些东西弄的晕头转向,处理本地化日期的通常的策略先将所有日期转换为UTC时间,并用它来执行所有的中间存储和操作。比如:

print(loc_d)  # ->2022-12-21 09:12:00-06:00
utc_d = loc_d.astimezone(pytz.utc)
print(utc_d)  # ->2022-12-21 15:12:00+00:00

​ 一旦转换为UTC,你就不用去担心跟夏令营时相关的问题了。因此,你可以跟之前一样放心的执行常见的日期计算。当你想将输出变成本地时间的时候,使用合适的时区去转换下就行了。比如:

later_utc=utc_d+timedelta(minutes=30)
print(later_utc.astimezone(central))  # ->2022-12-21 09:42:00-06:00

​ 当设计到时区操作的时候,有个问题就是我们如何得到时区的名称,比如,在这个例子中,我们如何知道‘Asia/Kolkata’就是印度对应的时区名呢?为了 查找,可以使用ISO 3166国家代码作为关键字去查阅字典pytz.country_timezone。比如:

print(pytz.country_timezones['IN'])  # ->['Asia/Kolkata']
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值