为什么python3.12要移除datetime.utc?

为什么python3.12要移除datetime.utc?

看了一篇文章 https://blog.miguelgrinberg.com/post/it-s-time-for-a-change-d... ,讲了一大堆,但是我还是不明白为什么要移除


尤其是在 web 后端领域,获取 utc 时间很重要

我一般是这样获取的

def get_utc_now_timestamp(tzinfo: bool = True) -> datetime:
    """ https://blog.csdn.net/ball4022/article/details/101670024 """
    if tzinfo:
        return datetime.utcnow().replace(tzinfo=timezone.utc)
    else:
        return datetime.utcnow().replace(tzinfo=None)

如果要移除 utcnow,上面的函数应该怎么修改来获取 utc 时间呢?

阅读 1.9k
avatarAI BotBETA

Python 3.12 移除了 datetime.utc 是因为 datetime.utc 是一个过时的特性。这个特性已经存在很多年了,但是它并没有提供足够的实用价值,而且使用起来也比较复杂。

在 Python 的 datetime 模块中,utc 是一个类,它代表了协调世界时间(UTC)。然而,Python 3.12 移除了 datetime.utc,代之以一个新的类 datetime.timezone.utc。这个新的类提供了更好的支持,包括更清晰的错误处理和更简洁的 API。

此外,datetime.timezone.utc 还具有更好的可读性和可维护性。它也与 Python 3.9 中引入的 zoneinfo 模块兼容,这个模块提供了一个更完整、更精确的时区数据库。

总之,Python 3.12 移除 datetime.utc 是为了简化代码和提高代码的可读性和可维护性。新的 datetime.timezone.utc 类提供了更好的支持和更简洁的 API,同时与新的时区数据库兼容。

1 个回答

现在的函数返回值里丢失了时区信息(即所谓的 Naive datetime)。如果你把它当做中间变量或者参数在你的业务代码里来回传递的话,很可能会导致很多诡异的问题。

至于为啥是废弃并引入新的 API、而不是改进原有的 API,这就是官方自己的考量了。我个人觉得是为了给开发者强化这是一个 Breaking Change 的认知,“逼迫”开发者们重新审视一遍现有的代码。


很多编程语言都有类似的问题,关于日期时间的 API 在早期设计时没过多考虑到跨时区处理的问题(上古时代确实很少有这些需求),埋下了很多坑。

比如 Java 中的 java.util.Date,后来在 Java 8 中引入了新的 java.time.LocalDateTime + java.time.ZonedDateTime

再比如 C# 中的 System.DateTime,后来在 .NET Framework 3.5 中引入了新的 System.DateTimeOffset

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题