在django项目中,会有时间时区的问题
在现实环境中,存在多个时区,用户之间很有可能存在于不同的时区,并且许多国家都拥有自己的一套夏令时系统,所以如果网站面向的是多个时区用户,只以当前时间为标准开发,便会在时间上产生错误。
为解决这个此类问题,在代码和数据库中统一使用 UTC 时间,仅在与最终用户进行交互时使用本地时间是一个很好的办法 。
Django 默认关闭时区支持,开启时区支持,需要在 settings 中设置 USE_TZ = True 。
可以通过Django的timezone模块,来查看当前时间所属的的时区
将时区设置为中国地区的东八区
查看时间得到:
因为中国属于东八区,就是说对世界标准时间来说快整整8个小时,
总的原理:
- 进入到django数据库中的时间一定是timezone aware的时间,如果要生成时间,要通过replace
timezone设置为本地时区。 - 数据库中的时间都是utc时间
from django.utils import timezone
>>> t=timezone.now()
>>> t
datetime.datetime(2016, 1, 4, 2, 13, 54, 582231, tzinfo=<UTC>)
>>>new_t=timezone.localtime(t)
>>>new_t
datetime.datetime(2016, 1, 4, 10, 13, 54, 582231, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
>>>import datetime
>>>t = datetime.datetime.strptime("2016-1-4", "%Y-%m-%d")
>>>t
datetime.datetime(2016, 1, 4, 0, 0)
>>>new_t = t.replace(tzinfo=(pytz.timezone('Asia/Shanghai')))
>>>new_t
datetime.datetime(2016, 1, 4, 0, 0, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)
- 当关闭时区时,django 使用原生的 datetime 对象保存本地时间:
import datetime
now = datetime.datetime.now()
- 当开启时区时,django 使用已知 (aware) 的 datetime 对象存储本地时间:
from django.utils import timezone
now = timezone.now()
实践:
当USE_TZ = True
from django.utils import timezone
t=timezone.now()
print(t) # 结果为: 2020-06-30 08:36:48.186132+00:00
当USE_TZ = False
from django.utils import timezone
t=timezone.now()
print(t) # 结果为: 2020-06-30 16:36:18.909139
本地时间大概是:2020-06-30 16
注意看他们两的结果,支持时区时,得到的是UTC时间,反之得到的是本地区时间(在这里是东八区时间)
由于操作有时间差,但是2020-06-30 16:36:18.909139减去2020-06-30 08:36:48.186132+00:00,基本上就是8小时
由于timezone生成的时间是本地时区的时间,所以在进行一些时间比较时,使用timezone就比较好,可以让时间本地化,不用担心跨时区问题,自己一点所得,有点乱,如果有大神指点,再好不过