添加时间显示后,报错:Database returned an invalid datetime value. Are time zone definitions for your database installed?

2021年6月19日18:01:30 评论 312

问题原因

时区问题

解决办法

1.在mysql设置时区

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

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

#USE_TZ = True
# TIME_ZONE = 'UTC'

USE_TZ = False
TIME_ZONE = 'Asia/Shanghai'

USE_TZ是统一全球的时间,不夸时区的应用可以把这个设置为False

这里把USE_TZ设置为False问题解决!

设置USE_TZ为Flase的时间显示格式

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

设置USE_TZ为True的时:

展开

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

USE_TZ = True会自动转成UTC时间,用mysql的时候要注意这个问题。

启用 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'

阿成哥
  • 本文由 发表于 2021年6月19日18:01:30
  • 转载请务必保留本文链接:https://blog.acwang.com/777.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: