1. 程式人生 > >Database returned an invalid datetime value. Are time zone definitions for your database installed?

Database returned an invalid datetime value. Are time zone definitions for your database installed?

user 格式 ont 解決 log cst query now() timezone

在做文章歸檔的會後,打印結果時報了這個錯誤

ret = models.Article.objects.filter(user=user).annotate(month=TruncMonth(created_time)).values(month).annotate(
    count=Count(nid)).values_list(
    month, count)
print(r------>, ret)

原因是時區問題

解決方案

在mysql設置時區

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+ | @@global.time_zone | @@session.time_zone | +--------------------+---------------------+ | SYSTEM | SYSTEM | +--------------------+---------------------+

修改django project下的settings.py中市區配置信息:

#USE_TZ = True
# TIME_ZONE = ‘UTC‘
USE_TZ = False TIME_ZONE = Asia/Shanghai

USE_TZ是統一全球的時間,不誇時區的應用可以把這個設置為False

設置USE_TZ為True的顯示格式

<QuerySet [(datetime.datetime(2019, 2, 1, 0, 0, tzinfo=<DstTzInfo Asia/Shanghai CST+8:00:00 STD>), 2)]>

設置USE_TZ為Flase的顯示格式

<QuerySet [(datetime.datetime(2019, 2, 1, 0, 0), 2)]>

參考:https://www.cnblogs.com/yy3b2007com/p/7601940.html#autoid-0-1-0

啟用 USE_TZ = True 後,處理時間方面,有兩條 “黃金法則”:

  1. 保證存儲到數據庫中的是 UTC 時間;
  2. 在函數之間傳遞時間參數時,確保時間已經轉換成 UTC 時間;

比如,通常獲取當前時間用的是:

import datetime
now = datetime.datetime.now()

啟用 USE_TZ = True 後,需要寫成:

import datetime 
from django.utils.timezone import utc
utcnow = datetime.datetime.utcnow().replace(tzinfo=utc)

模板

除非應用支持用戶設置自己所在的時區,通常我們不需要關心模板的時區問題。模板在展示時間的時候,會使用 settings.TIME_ZONE 中的設置自動把 UTC 時間轉成 settings.TIME_ZONE 所在時區的時間渲染。

TIME_ZONE = Asia/Shanghai

Database returned an invalid datetime value. Are time zone definitions for your database installed?