又名:python 中,给 datetime 添加时区偏移量的三种方式

pytz 的缺点

pytz 是什么,是一个 python 中处理时区问题的库

这个库有什么问题:

  • 处理北京时间(严格来讲是上海时间)的时候,会多 6 分钟,这很要命。(主要原因)
  • github 星星太少 (https://github.com/stub42/pytz

图片.png

具体原因请参考:为什么 pytz 不支持 北京时间(为什么很多东西不支持北京时间)?

什么是 zoneinfo?

换成 zoneinfo 就不会多出 6 分钟了吗?

是的!

zoneinfo 是什么,是 python 从 3.9 开始加入标准库,不需要你额外安装

参考:

代码样式:

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=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)
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)))

universe_king
3.4k 声望678 粉丝