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

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

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 时间与时区设置问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • django 按时间范围查询数据库实例代码

    从前台中获得时间范围,在django后台处理request中数据,完成format,按照范围调用函数查询数据库. 介绍一个简单的功能,就是从web表单里获取用户指定的时间范围,然后在数据库中查询此时间范围内的数据. 数据库里的model举例是这样: class book(models.Model): name = models.CharField(max_length=50, unique=True) date = models.DateTimeField() def __unicode__(s

  • 查看django执行的sql语句及消耗时间的两种方法

    下面介绍两种查看django 执行的sql语句的方法. 方法一: queryset = Apple.objects.all() print queryset.query SELECT `id`, `name` FROM `apple` 该方法只能查看select语句,但不能查看其他更新保存的语句,会报错. 也就是说只有 Queryset 有query方法.接下来看第二种方法. 方法二: from django.db import connection print connection.queri

  • 关于Django显示时间你应该知道的一些问题

    UTC与DST UTC可以视为一个世界统一的时间,以原子时为基础,其他时区的时间都是在这个基础上增加或减少的,比如中国的时区就为UTC+8. DST(夏时制)则是为了充分利用夏天日照长的特点,充分利用光照节约能源而人为调整时间的一种机制.通过在夏天将时间向前加一小时,使人们早睡早起节约能源.虽然很多西方国家都采用了DST,但是中国不采用DST. 1. 时区问题 首先是时区的问题,Django 默认使用的是 UTC 世界协调时,又叫世界统一时间.中国的时间与 UTC 的时差是+8小时,也就是中国时

  • Django中日期处理注意事项与自定义时间格式转换详解

    前言 我们在用Django创建models时,常常会涉及时间日期字段的处理,Django里日期相关Field有DateTimeField.DateField和TimeField三种类型,看似简单,但其中有一些容易出错的地方需要注意:另外,如果不习惯Django的默认时间格式,也可以自定义的修改. DateTimeField.DateField和TimeField,其值分别对应着Python里的datetime.datetime.datetime.date和datetime.time三个实例,这三

  • 详解Django 中是否使用时区的区别

    起步 在 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.st

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

    再写入数据库对时间进行加减操作时候 django报告了错误 TypeError: can't subtract offset-naive and offset-aware datetimes 修改setting.py 文件 在Django的配置文件settings.py中,有两个配置参数是跟时间与时区有关的,分别是TIME_ZONE和USE_TZ 如果USE_TZ设置为True时,Django会使用系统默认设置的时区,即America/Chicago, 此时的TIME_ZONE不管有没有设置都不

  • 详解Django中异步任务之django-celery

    Celery文档参考:http://docs.jinkan.org/docs/celery/ 参考文章:https://www.jb51.net/article/158046.htm Django中异步任务---django-celery Celery简单介绍: celery使用场景: 耗时任务定时任务 请求结果不怎么重要的 耗时任务比如:发送短信验证码我们可以先发送给客户任务状态(请求成功或失败) 请求结果重要的建议使用django实现 比如:支付 首先简单介绍一下,Celery 是一个强大的

  • 详解django中Template语言

    Django是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,即模型M,视图V和模版T.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件.并于2005年7月在BSD许可证下发布.这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的. 下面看下本文重点给大家介绍的django中Template语言,详情如下: Template本身也有自己的语言和语法,用来处理简单的数据显示 1.常用语法 判断

  • 详解Django模版中加载静态文件配置方法

    1.settings.INSTALLED_APPS下添加:django.contrib.staticfiles 2.settings.py下添加:STATIC_URL = '/static/' 3. (1)在APP下新建文件夹static,然后在这个static文件夹下创建一个当前APP的名字的文件夹,再把静态文件放到这个文件夹下:(类似于Templates配置) 在模板中这样调用: {% load static %} <img src="{% static 'front/logo.jpg

  • 详解Django中views数据查询使用locals()函数进行优化

    优化场景 利用视图函数(views)查询数据之后可以通过上下文context.字典.列表等方式将数据传递给HTML模板,由template引擎接收数据并完成解析.但是通过context传递数据可能就存在在不同的视图函数中使用重复的查询语句,所以可以通过将重复查询语句设置全局变量,配合locals()函数进行数据查询与传递. 优化前 def index(request): threatname = '威胁情报展示' url = 'www.testtip.com' allthreat = Threa

  • 详解Django+Vue+Docker搭建接口测试平台实战

    一. 开头说两句 大家好,我叫林宗霖,是一位测试工程师,也是全栈测开训练营中的一名学员. 在跟着训练营学习完Docker容器技术系列的课程后,理所应当需要通过实操来进行熟悉巩固.正好接口自动化测试平台需要迁移到新的测试服务器上,就想要体验一番Docker的"一次构建,处处运行".这篇文章简单介绍了下这次部署的过程,其中使用了Dockerfile定制镜像和Docker-Compose多容器编排. 二. 项目介绍 项目采用的是前后端分离技术来实现的,前端是Vue+ElementUI,后端是

  • 详解Jmeter线程组的设置方法

    目录 一.事件背景 二.关于线程组的相关设置 一.事件背景 个人感觉自己做性能测试,可以说是轻车熟路了,而且工作多年一直都是这一套测试思路及体系,从未质疑过自己,也许是狮子座的迷之自信吧! 也就在上周让我对自己的测试方法及体系产生了质疑! 为什么?在性能测试的时候,压测500并发通过,人家40并发都过不去. 通俗点说,就是你测试没问题,在人家那测试出问题了,忽略脚本问题,显而易见因为测试方法差异导致测试结果的不同. 1.关于执行方法的差异 同事的做法是直接跑10分钟的稳定性测试,然后上并发数:

  • 详解Django中CSRF和CORS的区别

    目录 一.CSRF:保护机制 二.CORS:跨域访问 一.CSRF:保护机制 Django预防CSRF攻击的方法是在用户提交的表单中加入一个csrftoken的隐含值,这个值和服务器中保存的csrftoken的值相同,这样做的原理如下: 1.在用户访问django的可信站点时,django反馈给用户的表单中有一个隐含字段csrftoken,这个值是在服务器端随机生成的,每一次提交表单都会生成不同的值 2.当用户提交django的表单时,服务器校验这个表单的csrftoken是否和自己保存的一致,

  • 详解Android通过修改配置文件设置wifi密码

    详解Android通过修改配置文件设置wifi密码 前言: 在一些非常规Android设备上,如眼镜/手表,输入wifi密码如同一场灾难.此时可以通过修改配置文件的方法设置wifi的ssid和密码. wifi密码配置文件 首先要保证设备已经root,wifi的配置文件在/data/misc/wifi/wpa_supplicant.conf,可以先将其pull出来,然后在下面加上network开头的那部分就ok了.然后再导入进去.下面是我的配置文件: ##### wpa_supplicant co

  • 详解django使用include无法跳转的解决方法

    一般的django项目我都喜欢采用以下的文件结构,使用include的方式,实现从总的url分配给apps里面的url Example: -projtect ---apps -----user -------urls.py -urls.py 但突然发现无法跳转,竟然是总url的这个错误! 以下是错误做法 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^', views.Index.as_view(), name='index'),

随机推荐