django 时区

1. 时区由来

地球是自西向东自转,东边比西边先看到太阳,东边的时间也比西边的早。东边时刻与西边时刻的差值不仅时区时区(4张)要以时计,而且还要以分和秒来计算,这给人们带来不便。
为了克服时间上的混乱,按经度将全球划分为24个时区,相邻时区相差一个小时。规定英国(格林尼治天文台旧址)为中时区(零时区),中国为东八区。

GMT 0:00 格林尼治标准时间
UT +00:00 全球时间
UTC +00:00 校准的全球时间
CCT +08:00 中国北京时间(俄罗斯伊尔库茨克时区)

GMT,即格林尼治标准时间,也就是世界时。GMT的正午是指当太阳横穿格林尼治子午线(本初子午线)时的时间。但由于地球自转不均匀不规则,导致GMT不精确,现在已经不再作为世界标准时间使用。

UTC,即协调世界时。UTC是以原子时秒长为基础,在时刻上尽量接近于GMT的一种时间计量系统。为确保UTC与GMT相差不会超过0.9秒,在有需要的情况下会在UTC内加上正或负闰秒。UTC现在作为世界标准时间使用。

所以,UTC与GMT基本上等同,误差不超过0.9秒。

2.django 时间类型

offset-aware与offset-navie
在Python中,有一个datetime模块,相信大家都很熟悉。但是很少有人知道这个模块的时间还可以分下面两种类型:

offset-naive:不含时区的类型
offset-aware:有时区的类型
并且,这两种类型的时间是不可以直接比较的,比如做减法、加法、时间对比等,会抛出下面的异常:

TypeError: can't compare offset-naive and offset-aware datetimes

根本的原因在于两者一个有时区信息,一个没有。

我们可以通过查看datetime对象的tzinfo属性,来判断具体是两者中的哪种:

>>> import datetime
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2020, 5, 26, 18, 36, 59, 811729)
>>> now.tzinfo
>>> now.tzinfo==None
True

可以很清楚的看到,datetime.datetime.now()是一个offset-naive类型,不含时区信息的时间对象。

我们可以借助pytz模块,将一个offset-naive类型的时间对象转换为一个offset-aware类型的时间对象。

先安装pytz模块:

	pip install pytz

来测试一下:

>>> import pytz
>>> now = now.replace(tzinfo=pytz.timezone('UTC'))
>>> now
datetime.datetime(2020, 5, 26, 18, 36, 59, 811729, tzinfo=<UTC>)
>>> now.tzinfo
<UTC>
反过来,也可以将一个offset-aware型转换为offset-naive型:

>>> now = now.replace(tzinfo=None)
>>> now
datetime.datetime(2020, 5, 26, 18, 36, 59, 811729)
>>> now.tzinfo == None
True

3.django 设置

LANGUAGE_CODE = 'zh-hans' # 语言

TIME_ZONE = 'UTC'  # 时区

USE_I18N = True  # 翻译插件

USE_L10N = True   # 时间显示格式

USE_TZ = True   # 附件时区信息

参考文档:
博客:https://www.cnblogs.com/django-dev/p/12968403.html
百度百科:https://baike.baidu.com/item/%E6%97%B6%E5%8C%BA/491122?fr=aladdin#5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值