📜  Python 不能减去 offset-naive 和 offset-aware 日期时间 - Python Code Example(1)

📅  最后修改于: 2023-12-03 14:46:11.726000             🧑  作者: Mango

Python 不能减去 offset-naive 和 offset-aware 日期时间

如果你在 Python 中使用 datetime 模块表示日期和时间,你可能会遇到以下错误:

TypeError: can't subtract offset-naive and offset-aware datetimes

这是由于 datetime 模块中有两种日期时间类型:offset-naive 和 offset-aware。

offset-naive 和 offset-aware

offset-naive 日期时间指代一个没有涉及时区信息的日期时间。例如:

from datetime import datetime
dt_naive = datetime(2021, 1, 1, 12, 0, 0)

offset-aware 日期时间则包含了时区信息。例如:

from datetime import datetime, timezone
dt_aware = datetime(2021, 1, 1, 12, 0, 0, tzinfo=timezone.utc)

这里我们使用了 timezone.utc 来设置一个 UTC 的时区信息。你也可以使用其他时区信息来创建 offset-aware 日期时间。

不能直接减去 offset-naive 和 offset-aware 日期时间

由于 offset-aware 日期时间包含了时区信息,它们并不能直接和 offset-naive 日期时间相减,否则会引发 TypeError。

如果你想计算两个 offset-aware 日期时间的时间差,你可以这样做:

from datetime import datetime, timezone

dt1 = datetime(2021, 1, 1, 12, 0, 0, tzinfo=timezone.utc)
dt2 = datetime(2021, 2, 1, 12, 0, 0, tzinfo=timezone.utc)

delta = dt2 - dt1

但是,如果你想计算一个 offset-naive 日期时间和一个 offset-aware 日期时间的时间差,则需要将 offset-naive 日期时间转换为 offset-aware 日期时间。你可以使用 pytz 模块来实现:

from datetime import datetime
import pytz

dt_naive = datetime(2021, 1, 1, 12, 0, 0)

tz = pytz.timezone('Asia/Shanghai')
dt_aware = tz.localize(dt_naive)

delta = dt_aware - datetime.now(pytz.utc)

这里,我们首先将 offset-naive 日期时间转换为上海时区的 offset-aware 日期时间,并将当前时间转换为 UTC 的 offset-aware 日期时间,再计算它们之间的时间差。

结论

Python 中不能直接减去 offset-naive 和 offset-aware 日期时间,但你可以使用 pytz 模块将 offset-naive 日期时间转换为 offset-aware 日期时间,以便进行时间计算。