報錯解決DateTimeField *** received a naive datetime (***) while time zone support is active
阿新 • • 發佈:2018-06-19
自動 djang inf lse 項目 cti 一個 AS time
這是一個跟時區有關的問題,報錯中說到datetime字段得到一個naive datetime,而不是支持time zone的active datetime
由於Django的設置中米哦人USE_TZ設置為True,Django會自動根據所設的時區對時間進行轉換,所以程序中和數據保存的時間都轉UTC時間,只有模版渲染時會把時間轉為TIME_ZONE所設置的時區的時間。
使用datetime.datetime.utcnow()輸出的是不帶時區的utc時間,稱為naive time
rom datetime import datetime datetime.now() datetime.datetime(2016, 06, 19, 07, 14, 55, 865000)
使用django.utils.timezone.now()輸出的是帶時區的utc時間,稱為active time
from django.utils import timezone timezone.now() datetime.datetime(2016, 06, 19, 07, 15, 48, 367000, tzinfo=<UTC>)
如果項目需要根據時區顯示時間,那就使用Django的timezone.now()。不需要的話將USE_TZ設置為False即可。
使用帶時區的時間,將所有用到datetime.now()的地方改為timezone.now(),並在對應的文件頂部加上from django.utils import timezone,就OK了。
如果項目中已經有了很多datetime.now(),又不想大面積改動的話,可以將import的語句修改一下
# from datetime import datetime # 原來用的註釋掉 from django.utils import timezone as datetime # 不想大面積修改就這麽做
報錯解決DateTimeField *** received a naive datetime (***) while time zone support is active