详解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发送HTTP请求的方法小结
Jul 08 Python
python基础知识小结之集合
Nov 25 Python
python使用邻接矩阵构造图代码示例
Nov 10 Python
python实现学生管理系统
Jan 11 Python
微信跳一跳python辅助脚本(总结)
Jan 11 Python
对python中的 os.mkdir和os.mkdirs详解
Oct 16 Python
浅谈python 导入模块和解决文件句柄找不到问题
Dec 15 Python
python使用插值法画出平滑曲线
Dec 15 Python
基于wxPython的GUI实现输入对话框(1)
Feb 27 Python
python使用flask与js进行前后台交互的例子
Jul 19 Python
python xlwt如何设置单元格的自定义背景颜色
Sep 03 Python
Python爬虫实现“盗取”微信好友信息的方法分析
Sep 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调用数据库的存贮过程!
2006/10/09 PHP
php绘制一个矩形的方法
2015/01/24 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
5个javascript的数字格式化函数分享
2011/12/07 Javascript
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
javascript常用函数(1)
2015/11/04 Javascript
js生成随机数的过程解析
2015/11/24 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
2017/12/24 Javascript
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
微信小程序实现展示评分结果功能
2019/02/15 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
layUI的验证码功能及校验实例
2019/10/25 Javascript
Vue+Java+Base64实现条码解析的示例
2020/09/23 Javascript
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
python爬虫框架talonspider简单介绍
2017/06/09 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
Python中Unittest框架的具体使用
2019/08/27 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
商务英语专业毕业生自荐信
2013/11/05 职场文书
竞选体育委员演讲稿
2014/04/26 职场文书
会计系毕业求职信
2014/08/07 职场文书
《我爱祖国》演讲稿1000字
2014/09/26 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
英语辞职信范文
2015/02/28 职场文书
个人党性锻炼总结
2015/03/05 职场文书
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS
SQL实现LeetCode(176.第二高薪水)
2021/08/04 MySQL
光之国的四大叛徒:第一贝利亚导致宇宙毁灭,赛文奥特曼在榜
2022/03/18 日漫