Database returned an invalid datetime value. Are time zone definitions for your database installed?
阿新 • • 發佈:2019-02-16
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 後,處理時間方面,有兩條 “黃金法則”:
- 保證存儲到數據庫中的是 UTC 時間;
- 在函數之間傳遞時間參數時,確保時間已經轉換成 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?