详解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 采集中文乱码问题的完美解决方法
Sep 27 Python
Python中的命令行参数解析工具之docopt详解
Mar 27 Python
python中将一个全部为int的list 转化为str的list方法
Apr 09 Python
python3 判断列表是一个空列表的方法
May 04 Python
Flask web开发处理POST请求实现(登录案例)
Jul 26 Python
浅谈python写入大量文件的问题
Nov 09 Python
浅谈pyqt5中信号与槽的认识
Feb 17 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
Apr 06 Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 Python
python中time库的实例使用方法
Oct 31 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
Feb 10 Python
Pycharm在指定目录下生成文件和删除文件的实现
Dec 28 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
WAR3重制版DOTA 5V5初体验
2020/04/09 DOTA
杏林同学录(四)
2006/10/09 PHP
php实现修改新闻时删除图片的方法
2015/05/12 PHP
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
2017/11/21 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2021/03/09 PHP
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
一个js拖拽的效果类和dom-drag.js浅析
2010/07/17 Javascript
javascript重写alert方法的实例代码
2013/03/29 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
JavaScript用JQuery呼叫Server端方法示例代码
2014/09/03 Javascript
jQuery基础语法实例入门
2014/12/23 Javascript
js操作数据库实现注册和登陆的简单实例
2016/05/26 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
VUE解决微信签名及SPA微信invalid signature问题(完美处理)
2019/03/29 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
vue实现禁止浏览器记住密码功能的示例代码
2021/02/03 Vue.js
Python中的异常处理简明介绍
2015/04/13 Python
Python sorted函数详解(高级篇)
2018/09/18 Python
python实现AES加密和解密
2019/03/27 Python
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
Europcar比利时:租车
2019/08/26 全球购物
函授本科自我鉴定
2013/11/03 职场文书
自荐书格式
2013/12/01 职场文书
开会迟到检讨书
2014/01/08 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
社区端午节活动总结
2015/02/11 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
Go中的条件语句Switch示例详解
2021/08/23 Golang
muduo TcpServer模块源码分析
2022/04/26 Redis