问题描述:
不同时区的人所在的时间是不同的,如果都采用当地时间,那么导致数据库存储的时间,并不是同一时刻的时间。但如果都采用0时区时间,那么不在0时区的用户就会看到错误的时间,怎么做呢?
解决方案: 在代码和数据库中都采用UTC时间(0时区时间),在和用户交互的时候采用当地时间。
1: 在配置文件中配置:
USE_TZ = True
2: 配置文件指定自己所在的时间戳(不指定默认是0时区)
LANGUAGE_CODE = 'zh-hans' # 语言:简体中文
TIME_ZONE = 'Asia/Shanghai' # 亚洲上海
3: 安装pytz模块:(时区转换专用模块)
pip install pytz -i https://pypi.tuna.tsinghua.edu.cn/simple
总结:
1:django中推荐使用USE_TZ = True,让数据库存储0时区时间。
2:django后端使用timezone获取当地时间,不使用原生的datetime。
3:django模板无需考虑时区问题,django将自动转换。
4:USE_TZ = True,和 TIME_ZONE = ‘Asia/Shanghai’ # 亚洲上海必须设置。
1:如果在没有django项目的情况下,django使用的自己的配置文件。
python3.5.2/site_packages/django/conf/global_settings
在django项目的依赖包中寻找到。
2: django项目下,django启动的是
项目中的settings文件
1: 时区关闭时,django使用原生的datetime对象保存本地时间。
2: 时区开启时,django使用已知的datetime对象保存本地时间。
注意:此时使用的是global_settings配置文件,不存在USE_TZ = True这个配置项。
python@ubuntu:~$ workon django_env
(django_env) python@ubuntu:~$ python3
>>> from django.conf import settings
>>> settings.configure()
>>> from django.utils import timezone
>>> now = timezone.now()
>>> now
datetime.datetime(2020, 10, 27, 21, 34, 48, 517250)
结论:当关闭时区时,django 使用原生的 datetime 对象保存本地时间。
注意:此时我们进入django项目中使用python3 manager.py shell进入django环境:
(django_env) python@ubuntu:~/Desktop/shopping-mall-project/shopping_mall$ python3 manage.py shell
>>> from django.utils import timezone
>>> now = timezone.now()
>>> now
datetime.datetime(2020, 10, 27, 13, 40, 35, 544740, tzinfo=<UTC>)
>>> new = timezone.localtime()
>>> new
datetime.datetime(2020, 10, 28, 8, 24, 1, 906910, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
结论: 时区开启时,django使用已知的datetime对象保存本地时间。使用localtime获取的是本地东八区的时间。(注意:,TIME_ZONE = ‘Asia/Shanghai’, 这个配置项必须存在才可以)。
注意: 由于timezone返回的对象也是datetime对象,所以方法同样试用。
>>> datetime.datetime.now()
datetime.datetime(2020, 10, 28, 8, 34, 56, 588940)
>>> today = datetime.datetime.today()
>>> today
datetime.datetime(2020, 10, 28, 8, 50, 34, 43761)
>>> new_time = datetime.datetime.now()
>>> new_time.time()
datetime.time(8, 38, 24, 280548)
>>> now_time = datetime.datetime.now()
>>> now_time.date()
datetime.date(2020, 10, 28)
# 时间点-时间间隔 = 时间点
>>> import datetime
>>> now_time = datetime.datetime.now()
>>> now_time
datetime.datetime(2020, 10, 28, 8, 47, 30, 232944)
>>> day_3_ago = now_time - datetime.timedelta(days = 3)
>>> day_3_ago
datetime.datetime(2020, 10, 25, 8, 47, 30, 232944)
>>> datetime.datetime.strptime('2017-3-22 15:25','%Y-%m-%d %H:%M')
datetime.datetime(2017, 3, 22, 15, 25)
>>> date_today = datetime.date.today()
>>> date_today
datetime.date(2020, 10, 28)
>>> date_today.year
2020
>>> date_today.month
10
>>> date_today.day
28
>>> a = datetime.date(2020, 10, 28)
>>> b = datetime.date(2020, 10, 27)
>>> a.__eq__(b) # 相等
False
>>> a.__gt__(b) # 大于
True
>>> a.__lt__(b) # 小于
False
>>> a.__le__(b) # 小于等于
False
>>> a.__lt__(b) # 大于等于
False
>>> a.__ne__(b) # 不等于
True
>>> today_date = datetime.date.today()
>>> today_date
datetime.date(2020, 10, 28)
>>> today_date = today_date.replace(year = today_date.year, month = today_date.month, day = 3)
>>> today_date
datetime.date(2020, 10, 3)
1: astimezone的使用:将一个时间对象(datetime)转换成UTC时间对象(datetime)
import datetime
import pytz
utc = pytz.timezone('UTC')
now_time = datetime.datetime.now()
utc_time = now_time.astimezone(tz=utc)
print(now_time,utc_time)
2: pytz.timezone(‘时区名’):此方法能获取一个tzinfo对象,该对象可在datetime生成时间中以参数的形式放入,即可生成对应时区的时间。
>>>utc = pytz.timezone('UTC')
>>>datetime.datetime.now(tz=utc)
2019-05-10 10:53:46.000929+00:00
实际的时间是:18:53:46