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