1、navie和aware时间问题
在跟时间相关的处理中,会存在navie和aware时间问题,在win上已经做了兼容处理,可能部署到服务器上就会存在相关的问题。
2、navie和aware时间分别是什么
navie时间:不知道是哪个时区。
aware时间:知道是哪个时区。
3、解决问题
可以利用pytz库(专门用来处理时区的库)的astimezone方法(只可以被aware时间调用),例子如下:
import pytz
from datetime import datetime
# navie时间
now = datetime.now()
# 定义UTC时区
utc_timezone = pytz.timezone("UTC")
# 当前时间转为UTC时区
utc_now = now.astimezone(utc_timezone)
# navie时间不能调用astimezone方法,抛出如下异常
# output : ValueError: astimezone() cannot be applied to a naive datetime
# 将navie时间改为aware时间,利用replace即可
now = now.replace(tzinfo=pytz.timezone('Asia/Shanghai'))
utc_now = now.astimezone(utc_timezone)
4、Django中的时间问题
在settings.py中设置USE_TZ=True
,这样就可以获取aware时间。
Django中的django.utils.timezone.now
方法类似于Python的datetime,得到的是UTC时间(比当前时间滞后8小时),可以利用将settings.py中设置TIME_ZONE='Asia/Shanghai'
,同时利用 django.utils.timezone.localtime
方法将UTC时间转化为本地时间。
方案一:
在settings.py
中设置USE_TZ=True
、TIME_ZONE='Asia/Shanghai'
,通过在models.py
中做如下定义:
creat_time = models.DateTimeField(auto_now_add=True)
在views.py
中做:
from django.utils.timezone import now, localtime
localtime(now()) # 并将其存于数据库
方案二:
在settings.py
中设置USE_TZ=True
、TIME_ZONE='Asia/Shanghai'
,通过在models.py
中做如下定义:
creat_time = models.DateTimeField(auto_now_add=True)
注意:
1、最重要的是auto_now_add
参数,当在settings.py
中做了上述的设置之后,这个参数等价于
from django.utils.timezone import now, localtime
localtime(now())
2、auto_now为添加或者修改的最新的时间(可变)。
auto_now_add为首次添加时的创建时间(不变)。