在现实环境中,存在有多个时区。用户之间颇有可能存在于不一样的时区,而且许多国家都拥有本身的一套夏令时系统。因此若是网站面向的是多个时区用户,只以当前时间为标准开发,便会在时间计算上产生错误。python
为解决这个此类问题,在代码和数据库中统一使用 UTC 时间,仅在与最终用户进行交互时使用本地时间是一个很好的办法 。
Django 默认关闭时区支持,开启时区支持,须要在 settings 中设置 USE_TZ = True 。数据库
# TIME_ZONE = 'UTC' TIME_ZONE = 'Asia/Shanghai'
最好同时安装 pytz 模块(pip install pytz) 。django
Python 的 datatime.datetime对象有一个 tzinfo 属性,该属性是 datetime.tzinfo 子类的一个实例,他被用来存储时区信息。当某个 datetime 对象的 tzinfo 属性被设置并给出一个时间偏移量时,咱们称该 datetime 对象是 aware (已知) 的。不然称其为 naive (原生) 的。
能够使用 is_aware() 和 is_naive() 函数来判断某个 datetime 对象是 aware 类型或 naive 类型。函数
import datetime now = datetime.datetime.now()
from django.utils import timezone now = timezone.now()
而默认Django开启时区且为utc,因此在不改变TIME_ZONE的状况下,django数据库中的时间必定是timezone aware的时间,若是要生成时间,要经过replace timezone设置为本地时区。网站
数据库中的时间都是utc时间
Django中的timezonecode
from django.utils import timezone t=timezone.now() print(t) datetime.datetime(2016, 1, 4, 2, 13, 54, 582231, tzinfo=<UTC>) new_t=timezone.localtime(t) print(new_t) datetime.datetime(2016, 1, 4, 10, 13, 54, 582231, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
Python中的datetime对象
import datetime t = datetime.datetime.strptime("2016-1-4", "%Y-%m-%d") print(t) datetime.datetime(2016, 1, 4, 0, 0) new_t = t.replace(tzinfo=(pytz.timezone('Asia/Shanghai'))) print(new_t) datetime.datetime(2016, 1, 4, 0, 0, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)