详解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 thread 并发且顺序运行示例
Apr 09 Python
python生成日历实例解析
Aug 21 Python
python计算一个序列的平均值的方法
Jul 11 Python
快速了解Python开发中的cookie及简单代码示例
Jan 17 Python
Python for循环与range函数的使用详解
Mar 23 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
Apr 17 Python
Python实现图片添加文字
Nov 26 Python
python add_argument()用法解析
Jan 29 Python
Python基于network模块制作电影人物关系图
Jun 19 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
Aug 17 Python
python如何实现word批量转HTML
Sep 30 Python
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
Oct 16 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版小黄鸡simsimi聊天机器人接口分享
2014/01/26 PHP
PHP时间处理类操作示例
2018/09/05 PHP
javascript中创建对象的三种常用方法
2010/12/30 Javascript
js清空表单数据的两种方式(遍历+reset)
2014/07/18 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
jQuery中大家不太了解的几个方法
2015/03/04 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
2015/11/16 Javascript
jQuery 获取多选框的值及多选框中文的函数
2016/05/16 Javascript
JavaScript程序中的流程控制语句用法总结
2016/05/23 Javascript
JavaScript关于提高网站性能的几点建议(一)
2016/07/24 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
最实用的JS数组函数整理
2017/12/05 Javascript
vue组件name的作用小结
2018/05/23 Javascript
jQuery实现的点击图片居中放大缩小功能示例
2019/01/16 jQuery
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
对Python3使运行暂停的方法详解
2019/02/18 Python
Python中求对数方法总结
2020/03/10 Python
python删除某个目录文件夹的方法
2020/05/26 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
CPB肌肤之钥美国官网:Clé de Peau Beauté
2017/09/05 全球购物
Gibson London官网:以地道的英国男装而著称
2019/12/06 全球购物
abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
2012/10/15 面试题
大三自我鉴定范文
2013/10/05 职场文书
经典的班主任推荐信
2013/10/28 职场文书
新闻编辑自荐书范文
2014/02/12 职场文书
大学奖学金获奖感言
2014/08/15 职场文书
2014小学生国庆65周年演讲稿
2014/09/21 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
工作年限证明模板
2015/06/15 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
90后经典动画片排行:《数码宝贝》第二,《小鲤鱼历险记》在榜
2022/03/18 日漫