详解Django 中是否使用时区的区别


Posted in Python onJune 14, 2018

起步

在 Django 的模型中新加了一个日期的字段:

import datetime
class Instance(models.Model):
  ...
  start_time = models.DateTimeField(default=datetime.datetime.now)

同步到数据库时 Django 报出了一个警告:

django/db/models/fields/__init__.py:1423: RuntimeWarning: DateTimeField Instance.start_time received a naive datetime (2018-06-14 08:59:54.761510) while time zone support is active.

这个意思是应用中开启了时区功能,而字段中却使用了 naive datetime 。我看了配置文件确实启用的时区的功能:

TIME_ZONE = 'Asia/Shanghai'
USE_TZ = True

如果设置了使用时区,那么Django在数据库中以 UTC 存储日期时间信息。

要想知道时区的 Django 中的作用,我们要先了解时间有时区的没有时区的区别。

带时区与不带时区

日期时间存在两个概念: naive time 和 aware time 。 naive time 就是不带时区的时间, aware time 则是带时区的时间。比方说, datatime.datetime.utcnow() datatime.datetime.now() ,前者是 UCT 时间,后者会取机器上的本地时间,这两者呢,对于 django 来说,都是不带时区的时间(下一段会讲原因);而使用 django.utils.timezone.now() 才是带时区的时间(aware time)。

datetime.datetime.now() 输出永远都是本地时间,与配置没有任何关系。 datatime.datetime.utcnow() 则是当前的UTC日期和时间, datetime 模块是 python 的标准库,尽管 datetime.datetime 对象有一个 tzinfo 属性可以用来存储时区信息。除非该对象设置了 tzinfo 属性,否则统统会被 django 认为是 naive time 。判断可以通过 is_naive() 来判断:

import datetime
from django.utils import timezone

print(timezone.is_naive( datetime.datetime.now() ))  # False
print(timezone.is_naive( datetime.datetime.utcnow() )) # False

显然 now() 和 utcnow() 都是没有设置 tzinfo 的。

django判断日期对象是否是原生的唯一标准就是该对象是否设置了 tzinfo

datetime 与 timezone

datetime 是标准库的模块, timezone 是 django 提供的时区的工具, timezone 其实是在 datetime 基础上进行的整合的,比方 django 中的 now 函数:

[timezone.py]
def now():
  """
  Return an aware or naive datetime.datetime, depending on settings.USE_TZ.
  """
  if settings.USE_TZ:
    # timeit shows that datetime.now(tz=utc) is 24% slower
    return datetime.utcnow().replace(tzinfo=utc)
  else:
    return datetime.now()

返回的其实也是一个 datetime 对象。

设置了 USE_TZ=True 之后

设置了 USE_TZ=True 之后,model 里面认为 DateTimeField 使用的是UTC时间(带时区的时间),这时用 datetime.datetime.now() 获取的时间是不带时区的就会报最开始说的那个警告。

并且呢, 所有的存储和内部处理,全部都是 UTC 时间 ,包括 timezone.now() ,存储也就是指数据库中存储的是UTC时间,也就只有在表单输入或模板渲染输出的时候,才会执行 UTC 到时区的转换。基本对于开发者而言,基本不用考虑本地时间的存在,所有的使用都是 UTC 时间,这也能避免手残的手动转换,尽量使用 Django 系统代劳。

USE_TZ=False 则所有关于时间和时区的问题都有开发人员自己把控。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
urllib2自定义opener详解
Feb 07 Python
python基础教程之简单入门说明(变量和控制语言使用方法)
Mar 25 Python
Python 专题六 局部变量、全局变量global、导入模块变量
Mar 20 Python
Python用csv写入文件_消除空余行的方法
Jul 06 Python
python 分离文件名和路径以及分离文件名和后缀的方法
Oct 21 Python
详解Python sys.argv使用方法
May 10 Python
聊聊python里如何用Borg pattern实现的单例模式
Jun 06 Python
Python脚本导出为exe程序的方法
Mar 25 Python
基于python实现计算且附带进度条代码实例
Mar 31 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
Jun 02 Python
Python 必须了解的5种高级特征
Sep 10 Python
详解Python为什么不用设计模式
Jun 24 Python
python dataframe 输出结果整行显示的方法
Jun 14 #Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
Jun 14 #Python
Python3.6简单反射操作示例
Jun 14 #Python
Python3.6日志Logging模块简单用法示例
Jun 14 #Python
Python实现的knn算法示例
Jun 14 #Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
Jun 14 #Python
Tensorflow 查看变量的值方法
Jun 14 #Python
You might like
使用PHP模拟HTTP认证
2006/10/09 PHP
发布一个用PHP fsockopen写的HTTP下载的类
2007/02/22 PHP
php中对xml读取的相关函数的介绍一
2008/06/05 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
2013/06/24 PHP
phplot生成图片类用法详解
2015/01/06 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
Javascript调用XML制作连动下拉列表框
2006/06/25 Javascript
静态的动态续篇之来点XML
2006/12/23 Javascript
JQuery实现table行折叠效果以JSON做数据源
2014/05/26 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
Vue 中的compile操作方法
2018/02/26 Javascript
使用pkg打包Node.js应用的方法步骤
2018/10/19 Javascript
JQuery样式与属性设置方法分析
2019/12/07 jQuery
在Angular项目使用socket.io实现通信的方法
2021/01/05 Javascript
利用Fn.py库在Python中进行函数式编程
2015/04/22 Python
详解Python中的静态方法与类成员方法
2017/02/28 Python
儿童编程python入门
2018/05/08 Python
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
利用Python将数值型特征进行离散化操作的方法
2018/11/06 Python
如何在Django配置文件里配置session链接
2019/08/06 Python
Python加速程序运行的方法
2020/07/29 Python
CSS3 透明色 RGBA使用介绍
2013/08/06 HTML / CSS
纯CSS3打造动感漂亮时尚的扇形菜单
2014/03/18 HTML / CSS
澳大利亚当地最大的时装生产商:Cue
2018/08/06 全球购物
您的时尚,您的生活方式:DTLR Villa
2019/12/25 全球购物
饲料采购员岗位职责
2013/12/19 职场文书
农民工创业典型事迹
2014/01/25 职场文书
五年后的职业生涯规划
2014/03/04 职场文书
法律进社区实施方案
2014/03/21 职场文书
致共产党员倡议书
2014/04/16 职场文书
计算机求职信
2014/07/02 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书
职场:企业印章管理制度(模板)
2019/10/18 职场文书
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
2022/04/29 Servers