首页 > 其他分享 >django时区问题的解决

django时区问题的解决

时间:2023-01-04 19:22:52浏览次数:58  
标签:UTC now datetime 时间 解决 时区 django

django时区问题的解决

 更新时间:2021年05月18日 09:37:58   作者:Silent丿丶黑羽     我们都知道时区,标准时区是UTC时区,django默认使用的就是UTC时区,我们希望存储在数据库中的时间就是本地时间(东八区的时间),那么应该怎么设置,就一起来了解一下  

前言

我们都知道时区,标准时区是UTC时区,django默认使用的就是UTC时区,所以我们存储在数据库中的时间是UTC的时间,但是当我们做的网站只面向国内用户,或者只是提供内部平台使用,我们希望存储在数据库中的时间就是本地时间(东八区的时间),那么django也是可以完成这样的需求的

await时间和navie时间

什么是await时间和navie时间?它是我们python中的两种时间类型

  • navie:不知道自己的时间表示哪个时区
  • await:知道自己的时间表示的是哪个时区的

django设置东八区时间

我们想让django中的时区变为东八区的时间,很简单

1 2 USE_TZ = False TIME_ZONE = 'Asia/Shanghai'

在settings.py文件中将USE_TZ设置为False,将TIME_ZONE设置为亚洲上海,之后我们在模型中创建时间字段的时候,在数据库中存储的就是东八区的时间,而时间的类型会使navie类型,所以我们就不能再把navie类型的时间转换成其他时区的类型,所以我们一般不建议这么做。 

django设置UTC时区

django中默认设置的是UTC时区,所以我们数据库中存储时间就是UTC时区的时间,也就是0时区,比我们正常见到的少8个小时,但是它的时间是await类型,可以转成任意时间的时区。

django中提供了2个时间的方法

  • django.utils.timezone.now:会根据settings.py文件中是否设置了USE_TZ=True获取当前的时间。如果为Ture,那么就获取一个aware类型的UTC时间,如果为False,那么就获取一个navie类型的时间
  • django.utils.timezone.localtime:会根据setting.py中的TIME_ZONE来将一个aware类型的时间转换为TIME_ZONE指定时区的时间

下面列出了几个常见的时区问题,并提供相关原因,如有不对,欢迎指出。

问题一:三个时间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=True与TIME_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时间就能满足,也能保证证模板时间的正确显示。

标签:UTC,now,datetime,时间,解决,时区,django
From: https://www.cnblogs.com/beichengshiqiao/p/17025781.html

相关文章

  • 5.解决实体类属性名和数据库字段不匹配问题
    1.问题  当出现数据库和实体类不匹配时,与数据库不配的属性就会查询不到数据    数据库中idnamepwd    实体类中idnamepassword    ......
  • Django 03
    https://docs.djangoproject.com/en/4.1/intro/tutorial03/fromdjango.urlsimportpathfrom.importviewsapp_name='polls'urlpatterns=[path('',views.......
  • Dev-c++下‘stoi‘ was not declared in this scope解决办法
    打开“工具”->“编译选项”选择“代码生成/优化”,设置成以下形式即可......
  • 针对FreeSWITCH的最佳开源GUI解决方案
    为了获得FreeSWITCH的最大利益,您需要能够正确选择GUI解决方案。看看FreeSWITCH的一些开源GUI解决方案,见证了它们的广泛普及和采用率。FreeSWITCHGUI被广泛地描述为FsG......
  • django 如何提升性能(高并发)
    django如何提升性能(高并发)对一个后端开发程序员来说,提升性能指标主要有两个一个是并发数,另一个是响应时间网站性能的优化一般包括web前端性能优化,应用服务器性能优化,存......
  • django中间件补充、django操作cookie与session
    django中间件补充、django操作cookie与session目录django中间件补充、django操作cookie与session基于django中间件实现功能的插拔式设计cookie与session简介django操作coo......
  • Java和C++通过Socket通信中文乱码的解决
    理想的开发状态是我开始就是C开发,一直是C的开发,现在还是C的开发,若干年后,幸运的话,我可以成为C语言的高手或者专家……更实际的情况是我开始是C开发,后来变成了JAVA开发,然后......
  • SIP穿越NAT&FireWall解决方案
    原文链接(也是转载)http://blog.csdn.net/yetyongjin/article/details/6881491。我修改了部分错字。 SIP从私网到公网会遇到什么样的问题呢?1. 包的地址转换。2.SIP消......
  • 在UOS下找不到windows用户之前使用的部分字体,如何解决?
    问题描述:windows用户之前使用的部分字体在UOS下找不到,如何解决?解决方法:首先需要说明下,字体通常是有版权的,在安装时需要注意版权问题。1、拷贝字体文件至/usr/share/fon......
  • 关于“/”应用程序中的服务器错误 之解决方案
    错误界面:有的网友提供的的解决方法是,在webconfig里面添加一个配置即:说明: 服务器上出现应用程序错误。此应用程序的当前自定义错误设置禁止远程查看应用程序错误的详细......