详解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的迭代器、生成器以及相关的itertools包
Apr 02 Python
python通过ssh-powershell监控windows的方法
Jun 02 Python
解析Python中的生成器及其与迭代器的差异
Jun 20 Python
用python实现简单EXCEL数据统计的实例
Jan 24 Python
在python 中实现运行多条shell命令
Jan 07 Python
解析PyCharm Python运行权限问题
Jan 08 Python
PyCharm取消波浪线、下划线和中划线的实现
Mar 03 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
解析Tensorflow之MNIST的使用
Jun 30 Python
13个Pandas实用技巧,助你提高开发效率
Aug 19 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
Oct 27 Python
win10+anaconda安装yolov5的方法及问题解决方案
Apr 29 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中配置文件操作 如config.php文件的读取修改等操作
2012/07/07 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
2014/06/30 PHP
详解WordPress中添加友情链接的方法
2016/05/21 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
PHP7扩展开发教程之Hello World实现方法示例
2017/08/03 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
Three.js源码阅读笔记(光照部分)
2012/12/27 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
node.js中的fs.chmod方法使用说明
2014/12/18 Javascript
jQuery使用经验小技巧(推荐)
2016/05/31 Javascript
jquery实现下拉菜单的手风琴效果
2017/07/23 jQuery
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
用python代码做configure文件
2014/07/20 Python
python使用tkinter实现简单计算器
2018/01/30 Python
python中字符串内置函数的用法总结
2018/09/13 Python
python和php哪个更适合写爬虫
2020/06/22 Python
Pycharm同步远程服务器调试的方法步骤
2020/11/04 Python
html5使用canvas实现弹幕功能示例
2017/09/11 HTML / CSS
详解如何将 Canvas 绘制过程转为视频
2021/01/25 HTML / CSS
牵手50香港:专为黄金岁月的单身人士而设的交友网站
2020/08/14 全球购物
西安夏日科技有限公司Java笔试题
2013/01/11 面试题
建筑实习自我鉴定
2013/10/18 职场文书
护士辞职信模板
2014/01/20 职场文书
物流创业计划书
2014/02/01 职场文书
田径运动会通讯稿
2014/09/13 职场文书
机关干部个人对照检查材料思想汇报
2014/09/28 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
安徽导游词
2015/02/12 职场文书
团委工作总结2015
2015/04/02 职场文书
班主任班级管理心得体会
2016/01/07 职场文书
美元符号 $
2022/02/17 杂记
Grafana可视化监控系统结合SpringBoot使用
2022/04/19 Redis
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js