django settings中设置USE_TZ = True,这是django官方推荐的方法,也是django5.0之后默认的设置。
当启用对时区的支持时,Django 在数据库中以 UTC 为单位存储日期时间信息,在内部使用具有时区的日期时间对象,并在模板和表单中将其转换为最终用户的时区。
如果用户居住在多个时区时,这会很方便。你要根据用户的时间来显示日期信息。
即使你的网站只在一个时区提供服务,在你的数据库中用 UTC 存储数据仍然是一个好的做法。主要原因是夏令时(DST)。许多国家都有一个 DST 系统,春天的时钟会向前移动,秋天的时钟会向后移动。当转换发生时,如果你使用当地时间工作,你很可能会遇到一年两次的错误。这可能对你的博客并不重要,但如果你每年向客户多收或少收一个小时的费用,每年两次,这就是一个问题。解决这个问题的办法是在代码中使用 UTC,只在与终端用户互动时使用当地时间。即使你的网站只在一个时区提供服务,在你的数据库中用 UTC 存储数据仍然是一个好的做法。主要原因是夏令时(DST)。许多国家都有一个 DST 系统,春天的时钟会向前移动,秋天的时钟会向后移动。当转换发生时,如果你使用当地时间工作,你很可能会遇到一年两次的错误。这可能对你的博客并不重要,但如果你每年向客户多收或少收一个小时的费用,每年两次,这就是一个问题。解决这个问题的办法是在代码中使用 UTC,只在与终端用户互动时使用当地时间。
可以看到,设置时区支持可以让时区转换的问题完全交给django来做,这样显然是更好的,很多文章说的直接把这个值设置为False是不推荐的。
但是设置之后,django在对mysql查询时会报一个错误"ValueError: Database returned an invalid datetime value. Are time zone definitions for your database installed?",这个是时区不同步导致的,需要手动同步mysql时区信息,同步方法如下:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -D mysql -u root -p
mysql -u root -p -e "flush tables;" mysql
第一句是加载时区表到mysql,第二步是刷新mysql查询缓存,root登录中间需要输root密码。
时区同步之后再用django查询mysql就好了。