详解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正则表达式使用范例分享
Dec 04 Python
Python切片索引用法示例
May 15 Python
python中的常量和变量代码详解
Jul 25 Python
Python numpy.array()生成相同元素数组的示例
Nov 12 Python
解决django中ModelForm多表单组合的问题
Jul 18 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
Aug 26 Python
Django后端发送小程序微信模板消息示例(服务通知)
Dec 17 Python
Python 识别12306图片验证码物品的实现示例
Jan 20 Python
Python MySQLdb 执行sql语句时的参数传递方式
Mar 04 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
Dec 04 Python
python 模拟登录B站的示例代码
Dec 15 Python
OpenCV实现常见的四种图像几何变换
Apr 01 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
一个php作的文本留言本的例子(三)
2006/10/09 PHP
php strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
php join函数应用
2011/05/04 PHP
PHP使用array_fill定义多维数组的方法
2015/03/18 PHP
js日期联动示例
2014/05/02 Javascript
原生JavaScript制作微博发布面板效果
2016/03/11 Javascript
基于jQuery Tipso插件实现消息提示框特效
2016/03/16 Javascript
JS创建对象的写法示例
2016/11/04 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
2016/12/16 Javascript
jQuery.form.js的使用详解
2017/06/14 jQuery
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
2020/01/22 Javascript
微信小程序实现自定义底部导航
2020/11/18 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
利用Python实现命令行版的火车票查看器
2016/08/05 Python
python入门教程之识别验证码
2017/03/04 Python
python多线程之事件Event的使用详解
2018/04/27 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
pygame游戏之旅 添加icon和bgm音效的方法
2018/11/21 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
2020/06/02 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
css3动画事件—webkitAnimationEnd与计时器time事件
2013/01/31 HTML / CSS
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
H5 canvas实现贪吃蛇小游戏
2017/07/28 HTML / CSS
新西兰演唱会和体育门票网站:Ticketmaster新西兰
2017/10/07 全球购物
Smashbox英国官网:美国知名彩妆品牌
2017/11/13 全球购物
教学大赛获奖感言
2014/01/15 职场文书
文化宣传方案
2014/03/13 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
法院个人总结
2015/03/03 职场文书
教师节主题班会教案
2015/08/17 职场文书
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书