详解Django 时间与时区设置问题


Posted in Python onJuly 23, 2019

再写入数据库对时间进行加减操作时候

django报告了错误

TypeError: can't subtract offset-naive and offset-aware datetimes

修改setting.py 文件

 在Django的配置文件settings.py中,有两个配置参数是跟时间与时区有关的,分别是TIME_ZONEUSE_TZ

如果USE_TZ设置为True时,Django会使用系统默认设置的时区,即America/Chicago,

此时的TIME_ZONE不管有没有设置都不起作用。

如果USE_TZ 设置为False,而TIME_ZONE设置为None,则Django还是会使用默认的America/Chicago时间。
 若TIME_ZONE设置为其它时区的话,则还要分情况,如果是Windows系统,则TIME_ZONE设置是没用的,Django会使用本机的时间。如果为其他系统,则使用该时区的时间,入设置USE_TZ = False, TIME_ZONE = ‘Asia/Shanghai', 则使用上海的UTC时间

ps:下面看下Django时间时区问题

在django1.4以后,存在两个概念

naive time 与 active time。

简单点讲,naive time就是不带时区的时间,Active time就是带时区的时间。

举例来说,使用datetime.datetime.utcnow()、datetime.datetime.now()输出的类似2015-05-11 09:10:33.080451就是不带时区的时间(naive time),

而使用django.util.timezone.now()输出的类似2015-05-11 09:05:19.936835+00:00的时间就是带时区的时间(Active time),其中+00:00表示的就是时区相对性。

另外一个概念UTC时间,UTC时间表示的是格林尼治平均时即可,即零区时间。而北京时间表示的是东八区时间,即UTC+8。

下面列出了几个常见的时区问题

问题一:三个时间datetime.datetime.now()、datetime.datetime.utcnow()与django.util.timezone.now()的区别

datetime.datetime.now():输出的永远是本地时间(naive time)与配置无任任何关系。

datetime.datetime.utcnow():如果setting中配置USE_TZ=True则输出的是UTC时间(naive time),如果setting中配置USE_TZ=False,则该输出时间与datetime.datetime.now()完全相同。

django.util.timezone.now():如果setting中配置USE_TZ=True则输出的是UTC时间(active time),如果配置USE_TZ=False,则与datetime.datetime.now()完全相同。

问题二:django存储到数据库的时间比本地时间小8个小时?

首先要明确的一点,Django1.4版本之前,对时区毫无概概念,对时间的存取、展示不做任何处理,数据库里存储的通常是本地时间,当然都是naive time。

Django在1.4版本之后存储如果设置了USE_TZ=True,则存储到数据库中的时间永远是UTC时间。这时如果settings里面设置了USE_TZ=True与TIME_ZONE = 'UTC',用datetime.datetime.now()获取的时间django会把这个时间当成UTC时间存储到数据库中去。如果修改设置为USE_TZ=TrueTIME_ZONE = 'Asia/Shanghai',用datetime.datetime.now()获取的时间由于不带时区,django会把这个时间当成Asia/Shanghai时间,即东八区时间,然后django会把这个时间转成带时区UTC时间存储到数据库中去,而读的时候直接按UTC时间读出来,这就是网上很多人遇到的存储到数据库中的时间比本地时间会小8个小时的原因。

问题三:DateTimeField role_cost_history.cost_time received a naive datetime (2015-05-12 19:59:01.259517) while time zone support is active?

这个问题是因为如果设置了USE_TZ=True之后,model里面认为DateTimeField使用UTC时间(带时区的时间),这时用datetime.datetime.now()获取的时间是不带时区的就会报这个问题。

问题四:django.util.timezone.now()输出时间比本地时间小8个小时

只要设置了USE_TZ=True,django.util.timezone.now()输出地永远是UTC时间,不管你设置的TIME_ZONE是什么。如果USE_TZ=False,则django.util.timezone.now()输出等同于datetime.datetime.now(),也不管TIME_ZONE设置的是什么。

问题五:模板显示时间

在设置了USE_TZ=True之后,如果设置了TIME_ZONE = 'Asia/Shanghai',尽管数据库中存储的是UTC时间,但在模板显示的时候,会转成TIME_ZONE所示的本地时间进行显示。

建议:为了统一时间,在django开发时,尽量使用UTC时间,即设置USE_TZ=True,TIME_ZONE = 'Asia/Shanghai',并且在获取时间的时候使用django.util.timezone.now()。因为后台程序使用时间时UTC时间就能满足,也能保证证模板时间的正确显示。

总结

以上所述是小编给大家介绍的Django 时间与时区设置问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 Python
Python 爬虫爬取指定博客的所有文章
Feb 17 Python
Python 在字符串中加入变量的实例讲解
May 02 Python
基于python的图片修复程序(实现水印去除)
Jun 04 Python
PyCharm代码整体缩进,反向缩进的方法
Jun 25 Python
Python读取mat文件,并转为csv文件的实例
Jul 04 Python
python 字典中文key处理,读取,比较方法
Jul 06 Python
python3实现猜数字游戏
Dec 07 Python
python命令行工具Click快速掌握
Jul 04 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
python3.8 微信发送服务器监控报警消息代码实现
Nov 05 Python
Python DES加密实现原理及实例解析
Jul 17 Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 #Python
python 抓包保存为pcap文件并解析的实例
Jul 23 #Python
Django ModelForm组件使用方法详解
Jul 23 #Python
Pandas之groupby( )用法笔记小结
Jul 23 #Python
Python OpenCV调用摄像头检测人脸并截图
Aug 20 #Python
使用PYTHON解析Wireshark的PCAP文件方法
Jul 23 #Python
Django 静态文件配置过程详解
Jul 23 #Python
You might like
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
2014/04/16 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
2015/09/19 Javascript
jquery心形点赞关注效果的简单实现
2016/11/14 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
ES6入门教程之let和const命令详解
2017/05/17 Javascript
vue实现全选、反选功能
2020/11/17 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
js基础之事件捕获与冒泡原理
2019/10/09 Javascript
uni-app从安装到卸载的入门教程
2020/05/15 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
[42:04]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第一局
2016/03/03 DOTA
跟老齐学Python之print详解
2014/09/28 Python
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
2015/05/20 Python
MySQL中表的复制以及大型数据表的备份教程
2015/11/25 Python
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
PyQt5事件处理之定时在控件上显示信息的代码
2020/03/25 Python
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
技术副厂长岗位职责
2013/12/26 职场文书
会计职业生涯规划范文
2014/01/04 职场文书
企业办公室岗位职责
2014/03/12 职场文书
品质主管岗位职责
2014/03/16 职场文书
青蓝工程实施方案
2014/03/27 职场文书
公司市场专员岗位职责
2014/06/29 职场文书
计算机相关专业自荐信
2014/07/02 职场文书
先进单位事迹材料
2014/12/25 职场文书
2015年留守儿童工作总结
2015/05/22 职场文书
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis