python datime 的坑 —— received a naive datetime while time zone support is active

在你使用 Django 插入一些时间类型的数据的时候,很可能会遇上面的错误,为什么呢?

from datetime import datetime

print(datetime.utcnow())

因为具有迷惑性的 utcnow 的输出并不携带时区信息,而在 Django 会对 datetime 类型的数据做时区校验。

如何获取带 utc 时区信息的 utcnow 呢?

换个问法可以这样问:
如果让 python datetime 类型带上时区信息,比如 utc 时区信息

需要使用下面的代码

datetime.utcnow().replace(tzinfo=timezone.utc)

来看看输出的差异:

from datetime import datetime, timezone

a = datetime.utcnow()
print(a, type(a))

a = datetime.utcnow().replace(tzinfo=timezone.utc)
print(a, type(a))

输出为:

2021-11-01 05:18:11.165279 <class 'datetime.datetime'>
2021-11-01 05:18:11.165811+00:00 <class 'datetime.datetime'>

看到后面的 +00:00 了吗?这个表示的就是时区信息。

这个 timeinfo 信息是保存在 datetime 类中的

@property
def tzinfo(self):
    """timezone info object"""
    return self._tzinfo

如果你正在使用 python 处理一些时区相关的内容,可以看看下面的内容:
写代码时常用到的 time helper 工具
mac mysql修改默认时区为 utc


universe_king
3.4k 声望680 粉丝