跳到内容

call-datetime-strptime-without-zone (DTZ007) (调用不带时区的 datetime.strptime)

派生自 flake8-datetimez 代码检查器。

作用

检查 datetime.datetime.strptime() 的使用,这些使用会导致创建 naive (不含时区信息) 的 datetime 对象。

为什么这不好?

Python datetime 对象可以是 naive (不含时区信息) 的或 timezone-aware (含时区信息) 的。 虽然 aware 对象表示时间中的特定时刻,但 naive 对象不包含足够的信息来明确地将自身定位到相对于其他 datetime 对象的位置。 由于这可能导致错误,因此建议始终使用 timezone-aware 对象。

不带 %zdatetime.datetime.strptime() 返回一个 naive datetime 对象。 紧随其后使用 .replace(tzinfo=<timezone>).astimezone()

示例

import datetime

datetime.datetime.strptime("2022/01/31", "%Y/%m/%d")

改为使用 .replace(tzinfo=<timezone>)

import datetime

datetime.datetime.strptime("2022/01/31", "%Y/%m/%d").replace(
    tzinfo=datetime.timezone.utc
)

或者,使用 .astimezone()

import datetime

datetime.datetime.strptime("2022/01/31", "%Y/%m/%d").astimezone(datetime.timezone.utc)

在 Python 3.11 及更高版本中,datetime.timezone.utc 可以替换为 datetime.UTC

参考