Django时区问题

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字段

来恢复时区。

你可能感兴趣的:(Django时区问题)