6.3、Django -ORM模型跟时间Field相关的navie和aware时间问题

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=TrueTIME_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=TrueTIME_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为首次添加时的创建时间(不变)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值