django时区问题的处理(USE_TZ)

 更新时间:2025年12月31日 09:01:54   作者:StanwenRen  
Django时区管理指南:理解USE_TZ=True的重要性,如何开启时区支持,以及如何在代码中正确使用datetime和timezone

一:Django出现的时间问题

问题描述:

不同时区的人所在的时间是不同的,如果都采用当地时间,那么导致数据库存储的时间,并不是同一时刻的时间。但如果都采用0时区时间,那么不在0时区的用户就会看到错误的时间,怎么做呢?

解决方案:

在代码和数据库中都采用UTC时间(0时区时间),在和用户交互的时候采用当地时间。

二:Django如何开启时区支持?

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

三:USe_TZ = True的效应

  • 作用一:前端传递过来的DateFiled类型,经过模型类,存到数据库中,全部是0时区时间。
  • 作用二: 后端自己写的代码,只要是使用timezone获取的时间(已知的时间)(带时区的时间),django会自己转换,无需我们手动转换。
  • 作用三:模板显示问题:django模板,会将数据库中0时区的时间转换成当地时间,无需我们自己转换。

总结:

  • 1:django中推荐使用USE_TZ = True,让数据库存储0时区时间。
  • 2:django后端使用timezone获取当地时间,不使用原生的datetime。
  • 3:django模板无需考虑时区问题,django将自动转换。
  • 4:USE_TZ = True,和 TIME_ZONE = ‘Asia/Shanghai’ # 亚洲上海必须设置。

四:了解django的配置文件

1:如果在没有django项目的情况下,django使用的自己的配置文件。

python3.5.2/site_packages/django/conf/global_settings

在django项目的依赖包中寻找到。

2: django项目下,django启动的是

项目中的settings文件

五:区分两类datetime对象

  • 时区关闭时,django使用原生的datetime对象保存本地时间。
  • 时区开启时,django使用已知的datetime对象保存本地时间。

验证:时区关闭时:django使用的timezone

注意:此时使用的是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使用的timezone

注意:

此时我们进入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’, 这个配置项必须存在才可以)。

六:datetime模块中的类

  • date类: 日期对象(年,月,日)
  • time类:时间对象(时,分, 秒,微秒)
  • datetime类:日期时间对象 (年,月,日,时,分,秒,微秒)
  • timedelta类:时间间隔对象
  • tzinfo类:时区信息对象。

七:datetime的常见用法

注意: 由于timezone返回的对象也是datetime对象,所以方法同样试用。

  • 1:获取当地是时间(年,月,日,时,分,秒,微秒):
>>> 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)
  • 2:将时间转换成(时,分,秒,微秒)
>>> new_time = datetime.datetime.now()
>>> new_time.time()
datetime.time(8, 38, 24, 280548)
  • 3:将时间转换成(年,月,日)
>>> now_time = datetime.datetime.now()
>>> now_time.date()
datetime.date(2020, 10, 28)
  • 4:时间的加减计算:
# 时间点-时间间隔 = 时间点
>>> 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)
  • 5:格式化日期转换成datetime对象:
>>> datetime.datetime.strptime('2017-3-22 15:25','%Y-%m-%d %H:%M')
datetime.datetime(2017, 3, 22, 15, 25)

八:date的常用用法

  • 1: date对象获取年月日:
>>> date_today = datetime.date.today()
>>> date_today
datetime.date(2020, 10, 28)
>>> date_today.year
2020
>>> date_today.month
10
>>> date_today.day
28
  • 2:日期比较大小
>>> 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
  • 3:replace替换:
>>> 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)

九:Django的时区转换

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python实现多人聊天室

    python实现多人聊天室

    这篇文章主要为大家详细介绍了python实现多人聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • tensorflow基于CNN实战mnist手写识别(小白必看)

    tensorflow基于CNN实战mnist手写识别(小白必看)

    这篇文章主要介绍了tensorflow基于CNN实战mnist手写识别(小白必看),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Python按要求从多个txt文本中提取指定数据的代码示例

    Python按要求从多个txt文本中提取指定数据的代码示例

    本文给大家介绍了Python如何按要求从多个txt文本中提取指定数据,遍历文件夹并从中找到文件名称符合我们需求的多个.txt格式文本文件,文中有相关的代码示例供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2023-12-12
  • 基于Python对xsl&xslx文件进行操作

    基于Python对xsl&xslx文件进行操作

    这篇文章主要为大家详细介绍了如何使用Python对xsl&xslx文件进行一些基本操作,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • 在Django中自定义filter并在template中的使用详解

    在Django中自定义filter并在template中的使用详解

    这篇文章主要介绍了在Django中自定义filter并在template中的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Python中的Joblib库使用学习总结

    Python中的Joblib库使用学习总结

    这篇文章主要介绍了Python中的Joblib库使用学习总结,Joblib是一组在Python中提供轻量级流水线的工具,Joblib已被优化得很快速,很健壮了,特别是在大数据上,并对numpy数组进行了特定的优化,需要的朋友可以参考下
    2023-08-08
  • Pytorch 使用 nii数据做输入数据的操作

    Pytorch 使用 nii数据做输入数据的操作

    这篇文章主要介绍了Pytorch 使用 nii数据做输入数据的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • 用代码帮你了解Python基础(3)

    用代码帮你了解Python基础(3)

    这篇文章主要用代码帮你了解Python基础,使用循环,字典和集合的示例代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • python tkinter基本属性详解

    python tkinter基本属性详解

    这篇文章主要介绍了python tkinter基本属性详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 浅析python常用数据文件处理方法

    浅析python常用数据文件处理方法

    这篇文章主要介绍了python常用数据文件处理方法,虽说python运行速度慢,但其编程速度,第三方包的丰富度是真的高,涉及到文件批处理还是会选择python,感兴趣的朋友跟随小编一起看看吧
    2021-10-10

最新评论