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()完全相同。