详解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 相关文章推荐
python Django模板的使用方法(图文)
Nov 04 Python
用Python实现一个简单的线程池
Apr 07 Python
python中循环语句while用法实例
May 16 Python
对pandas replace函数的使用方法小结
May 18 Python
Python使用wget实现下载网络文件功能示例
May 31 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
Jun 08 Python
Python简易版停车管理系统
Aug 12 Python
Python常用模块logging——日志输出功能(示例代码)
Nov 20 Python
Python中logging日志库实例详解
Feb 19 Python
python爬虫要用到的库总结
Jul 28 Python
python matplotlib绘制三维图的示例
Sep 24 Python
详解Pycharm第三方库的安装及使用方法
Dec 29 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连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
2007/08/19 Javascript
js 匿名调用实现代码
2009/06/19 Javascript
JavaScript实现数据类型的相互转换
2016/03/06 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
2016/08/25 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
AngularJs $parse、$eval和$observe、$watch详解
2016/09/21 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
详解前后端分离之VueJS前端
2017/05/24 Javascript
Angular.js中angular-ui-router的简单实践
2017/07/18 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
深入理解Promise.all
2018/08/08 Javascript
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
微信小程序返回箭头跳转到指定页面实例解析
2019/10/08 Javascript
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
用ReactJS和Python的Flask框架编写留言板的代码示例
2015/12/19 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
2017/08/18 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
python挖矿算力测试程序详解
2019/07/03 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
行政助理的职责
2013/11/14 职场文书
毕业自荐信
2013/12/16 职场文书
优秀广告词大全
2014/03/19 职场文书
中国梦演讲稿范文
2014/08/28 职场文书
2014乡镇班子个人对照检查材料思想汇报
2014/09/26 职场文书
MySQL Innodb索引机制详细介绍
2021/11/23 MySQL