pytz中的时间偏移问题
目录
问题
pytz 是 Python 的一个时区库,可以方便的定义时区,弥补了 Python 自带 datetime 库的不足。例如:
|
|
但是如果将这些时区对象作为 tzinfo 传入 datetime 的构造函数中,则会发生时间的偏移。
|
|
可以看到,与正常的结果相比,差了 6 分钟。不只是东八区有这个问题,其他的时区或多或少都有差值。
pytz
pytz 库文档中表示,上述使用方式是错误的。
tzinfo
datetime 构造函数中的tzinfo 参数与大多数的 pytz 时区不兼容,即会发生时间漂移。唯一的例外是没有夏令时转换的 UTC 时区,是安全的。
It is safe for timezones without daylight saving transitions though, such as UTC.
在 pytz 中正确处理时区的方式有两种:
localize
使用时区对象的 localize
方法,将一个 native 时间(不带时区)转换为带时区的时间。
|
|
astimezone
使用 datetime 对象的 astimezone
方法,将一个带时区的时间,转换为另一个时区的时间。
|
|
解决
通过 pytz 库的文档,我们可以得出,如果想要构建一个 Asia/Shanghai
的本地时间,可以:
- 创建
Asia/Shanghai
的 native 时间,然后通过 localize 方法转换为本地时间; - 使用 tzinfo=UTC 创建一个 UTC 时间,然后通过 astimezone 转换为本地时间。