Django时区详解

本文详细介绍了Django中的时区概念,包括datetime类时区说明、时间类型的相互转换,以及Django项目中时区的使用,如设置、Model中的应用和接口逻辑中的处理。重点讨论了datetime.datetime.now()、datetime.datetime.utcnow()与django.util.timezone.now()的区别,并提供了时间转换和处理的实例。同时,还提到了Django时区转换中的一些趣味知识和常见问题。
摘要由CSDN通过智能技术生成

1时区基础概念

datetime类时区说明

dateitme类可以区分为naive time(不带时区时间)和active time(带时区时间)
Django1.4版本后引入了时区的概念,从此Django中可以通过设置settings文件来控制datetime类是否带时区处理。

>>> from django.utils import timezone

>>> import datetime

>>> tznow= timezone.now()

>>> tznow

datetime.datetime(2018, 11, 7, 7, 52, 30, 559952, tzinfo=<UTC>) //active time

>>> now = datetime.datetime.now()

>>> now

datetime.datetime(2018, 11, 7, 15, 52, 42, 863197)// naive time

可以看到active time 中存在tzinfo,这个是记录该active time 所对应的时区,UTC时间表示的是格林尼治平均时,即零区时间。而北京时间表示的是东八区时间,即UTC+8,在Django 中用 ‘Asia/Shanghai’ 表示。tznow 的数据表示为该值为时区为UTC的时间,now 为本机当前时间。

时间类型的相互转换

naive time

>>> import datetime, pytz

>>> a = datetime.datetime.now()

>>> a

datetime.datetime(2018, 11, 8, 10, 26, 6, 18039)

navie time 转化为 UTC时区 active time

>>> b = a.replace(tzinfo=pytz.utc)

>>> b

datetime.datetime(2018, 11, 8, 10, 26, 6, 18039, tzinfo=<UTC>)

UTC 时区转化为中国时区

>>> c = b.replace(tzinfo=pytz.timezone('Asia/Shanghai'))

>>> c

datetime.datetime(2018, 11, 8, 10, 26, 6, 18039, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)

active time 转化为 naive time

>>> d = c.replace(tzinfo=None)

>>> d

datetime.datetime(2018, 11, 8, 10, 26, 6, 18039)

注意

可以查看到以上内容的不管是naive time 转为 active time ,还是不同时区的相互转换,对应的时间没有改变,改变的只有其表示的时区信息。
如果需要将active time转化为对应时区的对应时间需要使用astimezone方法

>>> b

datetime.datetime(2018, 11, 8, 10, 26, 6, 18039, tzinfo=<UTC>)

>>> b.astimezone(pytz.timezone('Asia/Shanghai'))

datetime.datetime(2018, 11, 8, 18, 26, 6, 18039, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

datetime.datetime.now()、datetime.datetime.utcnow()与django.util.timezone.now()的区别

datetime.datetime.now():输出的永远是本地时间(naive time)与配置无任任何关系。

datetime.datetime.utcnow():如果setting中配置USE_TZ=True则输出的是UTC时间(naive time),如果setting中配置USE_TZ=False,则该输出时间与datetime.datetime.now()完全相同。

django.util.timezone.now():如果setting中配置USE_TZ=True则输出的是UTC时间(active time),如果配置USE_TZ=False,则与datetime.datetime.now()完全相同。

2Django项目使用

使用时区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值