1. 程式人生 > >報錯解決DateTimeField *** received a naive datetime (***) while time zone support is active

報錯解決DateTimeField *** received a naive datetime (***) while time zone support is active

自動 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