Django 时间、时区问题及解决方法

2019-11-15 11:07:20 最后一行代码 阅读:461

分类: Django

一、settings.py配置说明

TIME_ZONE        设置时区

USE_TZ               是否开启时区

 

二、Django中时间获取

建议通过Django自带的模块django.util.timezone获取时间,该方法会根据TIME_ZONE和USE_TZ设置的值获取时间。当USE_TZ=True时,timezone.now()获取的时间就是UTC时间。

python的时间分为aware和naive两种,前者是带时区的时间,后者是不带时区的时间。

 

三、问题一 datetime.datetime.now()和django.util.timezone.now()获取的时间区别?

datetime.datetime.now()  在Windows系统下返回的是aware时间(带时区),但是在Linux系统下返回的是naive时间(不带时区)。

django.util.timezone.now()  不管在哪个系统下返回的时间总是UTC时间,只要USE_TZ=True。

注意:如果想要转换时间的时区,该时间必须是aware时间(带时区),否则报错。

import datetime
from django.utils import timezone

datetime.datetime.now()     # 返回本地时间
timezone.now()              # 根据USE_TZ返回时间

 

四、问题二 数据库中保存的时间是UTC时间,为什么在模板中输出就是正常的时间?

只要USE_TZ=True,那么django.util.timezone.now()获取的时间就是UTC时间,所以数据库中保存的也是UTC时间,但是在模板中输出时间会自动根据TIME_ZONE进行转换,设置的什么时区就转换成什么时间。

 

五、问题三 提示DateTimeField role_cost_history.cost_time received a naive datetime (2017-05-12 19:58:01.259517)while time zone support is active?

一般这个报错都是通过datetime.datetime.now()获取时间,因为该方法获取的时间都是naive类型时间,所以会抛出这个错误。解决方法是使用make_aware()函数转换成aware类型时间。

如果想知道时间类型可以通过is_naive()函数判断时间对象是否为naive类型时间,返回布尔值。

 

六、timezone模块的方法

(1)获取TIME_ZONE设置的时区时间。返回datetime类型。

localtime()   

from django.utils import timezone

# value时间对象,默认使用当前系统时间
# timezone指定时区,默认使用TIME_ZONE设置的时区
t = timezone.localtime(value=None,timezone=None)
print(t)  
print(type(t))
# 2019-11-15 11:11:06.065443+08:00
# <class 'datetime.datetime'>

 

(2)将获取TIME_ZONE设置的时区时间。返回date类型

localdate() 

from django.utils import timezone

# value时间对象,默认使用当前系统时间
# timezone指定时区,默认使用TIME_ZONE设置的时区
t = timezone.localdate(value=None,timezone=None)
print(t)
print(type(t))
# 2019-11-15
# <class 'datetime.date'>

 

(3)转换为aware类型时间 。

make_aware()

(4)转换为naive类型时间。和make_aware()用法一样就不演示了。

make_naive() 

import datetime
from django.utils.timezone import make_aware, is_naive

t1 = datetime.datetime.now()
t1 = make_aware(t1)         # 转换成aware类型时间
print(is_naive(t1))
# False

t2 = datetime.datetime.now()
print(is_naive(t2))
# True

 

(5)判断指定时间对象是否为naive类型的时间。

is_naive()  

import datetime
from django.utils.timezone import is_naive
from django.utils import timezone

t = datetime.datetime.now()
print(is_naive(t))
# True

t = timezone.now()
print(is_naive(t))
# False

 

回复:

快来抢沙发

老板赏瓶水呗
微信 微信 支付宝 支付宝