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