Python中datetime.utcnow()已经弃用


Python 中已弃用 datetime.utcnow()和datetime.utcfromtimestamp()函数;使用时区感知的日期时间代替。

这是新的 Python 3.12 版本的发行说明,弃用部分中的一项

utcnow() 和 utcfromtimestamp() 有什么问题?
Python 维护者发现的问题来自于这些函数返回的 "幼稚 "日期时间对象。
所谓 "幼稚 "日期时间对象是指没有时区的对象,这意味着它只能在时区无关紧要或已经预先知道的情况下使用。
这与 "感知 "日期时间对象形成了鲜明对比,"感知aware "日期时间对象明确附加了时区。

  • utcnow():自 3.12 版起已弃用:使用带有UTC的 datetime.now() 代替 。
  • utcfromtimestamp():自 3.12 版起已弃用:使用带有UTC的 datetime.fromtimestamp() 代替 。

代码:

from datetime import datetime, timezone

def aware_utcnow():
    return datetime.now(timezone.utc)

def aware_utcfromtimestamp(timestamp):
    return datetime.fromtimestamp(timestamp, timezone.utc)

def naive_utcnow():
    return aware_utcnow().replace(tzinfo=None)

def naive_utcfromtimestamp(timestamp):
    return aware_utcfromtimestamp(timestamp).replace(tzinfo=None)

print(aware_utcnow())
print(aware_utcfromtimestamp(0))
print(naive_utcnow())
print(naive_utcfromtimestamp(0))

结果(运行时间是2023-11-18):

2023-11-18 11:36:35.137639+00:00
1970-01-01 00:00:00+00:00
2023-11-18 11:36:35.137672
1970-01-01 00:00:00

结果中:

  • 第一行和第二行显示的是可感知的日期时间实例,后缀 +00:00 表示时区为 00:00 或 UTC。
  • 第三行和第四行显示的是不含时区的抽象时间戳,与废弃函数返回的时间戳完全兼容。