又名:python 中,给 datetime 添加时区偏移量的三种方式
pytz 的缺点
pytz 是什么,是一个 python 中处理时区问题的库
这个库有什么问题:
- 处理北京时间(严格来讲是上海时间)的时候,会多 6 分钟,这很要命。(主要原因)
- github 星星太少 (https://github.com/stub42/pytz)
具体原因请参考:为什么 pytz 不支持 北京时间(为什么很多东西不支持北京时间)?
什么是 zoneinfo?
换成 zoneinfo 就不会多出 6 分钟了吗?
是的!
zoneinfo 是什么,是 python 从 3.9 开始加入标准库,不需要你额外安装
参考:
- python3.9 新功能之 zoneinfo
- python3.9 zoneinfo 文档
代码样式:
from zoneinfo import ZoneInfo
from datetime import datetime
import pytz
# 使用第三方库 pytz 给 datetime 添加时区信息
print(datetime.now().replace(tzinfo=pytz.timezone('Asia/Shanghai')))
# 使用标准库 ZoneInfo 给 datetime 添加时区信息
tz = ZoneInfo('Asia/Shanghai')
print(datetime.now(tz))
输出如下:
2023-06-17 13:36:54.594807+08:06
2023-06-17 13:36:54.605920+08:00
最简单的方法——啥文字信息都不要
如果你不想要这些乱七八糟的文字信息,只想添加 8 小时的时区偏移量怎么办?
from datetime import datetime, timedelta, timezone
from zoneinfo import ZoneInfo
beijing_offset = timedelta(hours=8)
current_time = datetime.now(timezone(beijing_offset))
print(current_time)
输出如下:
2023-06-17 13:58:57.897151+08:00
(如果你不懂「文字信息」是啥意思,继续看)但是要注意,这里的代码样式,上面的代码使用直接 print ,所以你只能看到 +8:00
这样的格式,如果调用 repr 那就不一样了
from datetime import datetime, timezone, timedelta
from zoneinfo import ZoneInfo
from datetime import datetime
import pytz
# 使用第三方库 pytz 给 datetime 添加时区信息
print(repr(datetime.now().replace(tzinfo=pytz.timezone('Asia/Shanghai'))))
# 使用标准库 ZoneInfo 给 datetime 添加时区信息
tz = ZoneInfo('Asia/Shanghai')
print(repr(datetime.now(tz)))
# 啥文字信息都不要,直接通过添加时区偏移量的方式实现
beijing_offset = timedelta(hours=8)
current_time = datetime.now(timezone(beijing_offset))
print(repr(current_time))
输出如下:
datetime.datetime(2023, 6, 17, 14, 4, 8, 485775, tzinfo=)
datetime.datetime(2023, 6, 17, 14, 4, 8, 499048, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai'))
datetime.datetime(2023, 6, 17, 14, 4, 8, 499061, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))