settings.TIME_ZONE = 'Asia/Shanghai'
settings.USE_TZ = True
情况1:
在使用django model的时候,我向一个datetimefield存了datetime.datetime.now(),但从数据库中之间查看,里面记录的时间少了8小时,也就是说数据库中存了UTC时间,django做了自动转换。然后在做rest服务器时,直接从中从数据后显示,显示的也是UTC时间,这里django并没有转换。事实上django在模板系统中做了自动转换,转换为本地时间。
情况2:
在使用django model datetimefield的时候,利用admin设置这个时间,但在数据库中仍然减了8小时,即UTC。而把TIME_ZONE改为UTC时,这个情况并没有变化。
今天研究并验证了一下django的时区问题,下面我得到的结论:
主要针对:
settings.py的两个字段:
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = True
和django的models和templates
操作:
datatime.now()存入models的DateTimeField字段
Ubuntu:
1.在开启了USE_TZ以后,django会把从系统获得的时间首先转换为TIME_ZONE的时区,然后再根据TIME_ZONE转换为UTC时间存储到数据库,在取数据时django templates也会根据TIME_ZONE把时区恢复。
2.USE_TZ关闭时,django会把从系统获得的时间首先转换为TIME_ZONE的时区,然后存到数据库中。
Windows:
1.在开启了USE_TZ后,django会把从系统获得的时间,直接根据TIME_ZONE转换为UTC时间存储到数据库,在取数据时django templates也会根据TIME_ZONE把时区恢复。
(因此,如果本机时区和TIME_ZONE不一样,会导致数据库UTC时间不正确)
2.在关闭了USE_TZ后,django会把从系统获得的时间直接存取。
3.转换时,如果已经安装了pytz(目前没装),则会读取TIME_ZONE字段,根据所设置的时区进行转换;如果没有安装,则按本机时区转换。
补充:在做rest服务器时,面对已经被转换成UTC的时间,又不能用django templates模板系统恢复时区,可以用:
from django.utils.timezone import get_default_timezone # 获取settings.TIME_ZONE
x.astimezone(get_default_timezone()) # x为models里定义的DateTimeField字段
来恢复时区。