详解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中的迭代器和生成器
Oct 26 Python
Python中内建函数的简单用法说明
May 05 Python
python中MethodType方法介绍与使用示例
Aug 03 Python
Python操作MySQL模拟银行转账
Mar 12 Python
python Celery定时任务的示例
Mar 13 Python
Python 机器学习库 NumPy入门教程
Apr 19 Python
浅析Python四种数据类型
Sep 26 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
May 04 Python
Django框架视图层URL映射与反向解析实例分析
Jul 29 Python
python定位xpath 节点位置的方法
Aug 27 Python
python模拟实现斗地主发牌
Jan 07 Python
在python3中实现查找数组中最接近与某值的元素操作
Feb 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写入、删除与复制文件的方法
2015/06/20 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
php引用和拷贝的区别知识点总结
2019/09/23 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
javascript OFFICE控件测试代码
2009/12/08 Javascript
NodeJS 模块开发及发布详解分享
2012/03/07 NodeJs
AJAX跨域请求json数据的实现方法
2013/11/11 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
Bootstrap table分页问题汇总
2016/05/30 Javascript
Vue.js第四天学习笔记(组件)
2016/12/02 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
2017/02/12 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
基于JS实现9种不同的面包屑和分布式多步骤导航效果
2017/02/21 Javascript
利用Javascript实现一套自定义事件机制
2017/12/14 Javascript
快速搭建vue2.0+boostrap项目的方法
2018/04/09 Javascript
vue ssr 指南详读
2018/06/29 Javascript
vue router 通过路由来实现切换头部标题功能
2019/04/24 Javascript
Element Rate 评分的使用方法
2020/07/27 Javascript
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
Python中使用摄像头实现简单的延时摄影技术
2015/03/27 Python
python3.5仿微软计算器程序
2020/03/30 Python
python下os模块强大的重命名方法renames详解
2017/03/07 Python
python 执行shell命令并将结果保存的实例
2018/05/11 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
Python遍历字典方式就实例详解
2019/12/28 Python
Python简单实现区域生长方式
2020/01/16 Python
简述python Scrapy框架
2020/08/17 Python
golang/python实现归并排序实例代码
2020/08/30 Python
Python在后台自动解压各种压缩文件的实现方法
2020/11/10 Python
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
班主任个人工作反思
2014/04/28 职场文书
感谢信
2019/04/11 职场文书
七年级作文之游记
2019/12/11 职场文书
Java常用函数式接口总结
2021/06/29 Java/Android