Python 3.12版本对标准库中的datetime模块做了重要调整,移除了原先提供的utcnow、utcfromtimestamp等和UTC时间相关的函数,这一改动主要源于原有接口在设计上存在缺陷,比如返回的datetime对象没有绑定时区信息,容易导致时间计算时出现偏差。开发新版本代码时不能再沿用旧的使用习惯,需要改用更规范的时区处理方式。

移除utc函数的核心原因
原有的datetime.utcnow()和datetime.utcfromtimestamp()函数返回的datetime对象属于 naive 类型,也就是没有携带时区信息。在实际开发中,如果开发者误以为这类对象是本地时间或者错误地和带时区的对象做运算,就会出现时间偏移的问题。Python官方希望推动开发者使用显式绑定时区的时间对象,减少这类隐蔽的错误,因此在新版本中移除了这些容易引发问题的接口。
新版本获取UTC时间的正确方法
方法一:使用datetime.now搭配timezone.utc
新版本中更推荐的做法是显式指定时区参数,通过datetime.now()方法传入timezone.utc来获取带时区信息的UTC时间对象,这种写法返回的datetime属于 aware 类型,后续做时间计算或者转换时都不会出现时区歧义。
from datetime import datetime, timezone # 获取当前UTC时间,对象携带时区信息 utc_time = datetime.now(timezone.utc) print(utc_time) # 输出示例:2024-05-20 12:34:56.789012+00:00
方法二:从时间戳转换获取UTC时间
如果需要从时间戳转换为UTC时间,可以使用datetime.fromtimestamp()方法,同样传入timezone.utc作为时区参数,避免返回无时区信息的对象。
from datetime import datetime, timezone import time # 获取当前时间戳 current_timestamp = time.time() # 将时间戳转换为UTC时间,绑定时区 utc_time_from_ts = datetime.fromtimestamp(current_timestamp, tz=timezone.utc) print(utc_time_from_ts)
方法三:手动构造UTC时间对象
如果需要手动构造指定的UTC时间,也可以先创建基础的datetime对象,再通过replace方法绑定时区信息。
from datetime import datetime, timezone # 构造指定的UTC时间,绑定时区 custom_utc_time = datetime(2024, 5, 20, 10, 30, 0, tzinfo=timezone.utc) print(custom_utc_time)
新旧写法对比
为了更清晰地看到新旧写法的差异,我们可以参考下面的对比表格:
| 场景 | 旧版本写法(Python 3.11及之前) | 新版本写法(Python 3.12及之后) |
|---|---|---|
| 获取当前UTC时间 | datetime.utcnow() | datetime.now(timezone.utc) |
| 时间戳转UTC时间 | datetime.utcfromtimestamp(ts) | datetime.fromtimestamp(ts, tz=timezone.utc) |
| 返回对象属性 | 无时区信息的naive对象 | 带UTC时区的aware对象 |
注意事项
- 新版本中如果仍然使用
datetime.utcnow()会直接抛出AttributeError错误,需要提前修改代码适配。 - 带时区的aware对象和naive对象不能直接做加减运算,需要先统一时区或者给naive对象绑定正确的时区信息。
- 如果项目需要兼容新旧版本Python,可以添加一个版本判断逻辑,根据运行环境选择对应的时间获取方式。
from datetime import datetime, timezone
import sys
def get_utc_time():
# 兼容新旧版本Python的UTC时间获取逻辑
if sys.version_info >= (3, 12):
return datetime.now(timezone.utc)
else:
return datetime.utcnow()
print(get_utc_time())
Pythondatetime模块UTC时间utc函数修改时间:2026-06-04 00:14:00