datetime.now、datetime.utcnow以及Django中的timezone.now之间的区别

2023-12-31 15:38

本文主要是介绍datetime.now、datetime.utcnow以及Django中的timezone.now之间的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        在我们使用Django做项目时经常会遇到时间的存储与读取不一致的问题,针对这个问题,我在查阅了一些资料,现总结一下给大家分享。

        由于现在使用的django大都在1.4版本以后,所以就存在两个概念naive time与active time。naive time就是不带时区的时间,active time就是带时区的时间例如, 使用datetime.datetime.utcnow()、datetime.datetime.now()输出的类似2018-07-10 14:10:33.080451是不带时区的时间(naive time),而使用django.until.timezone.now()输出的类似2015-07-10 14:11:19.936835+00:00是带时区的时间(active time),其中+00:00表示的就是时区相对性。注意,我们还可能会遇到另外一个概念的时间UTC时间,也就是格林尼治平均时间,也被称作零区时间,而北京时间就代表东八区时间,即UTC+8。

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

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

        2、datetime.datime.utcnow():如果在django配置USE_TZ=False,则该输出时间与datetime.datetime.now()完全相同;如果设置USE_TZ=True,则输出的是UTC时间(naive time);

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

        二、django存储到数据库的时间比本地时间小8个小时

         1、Django在1.4版本以后存储设置USE_TZ=True,则存储到数据库中的时间永远是UTC时间;

        2、这是如果Django的setting设置USE_TZ=True与TIME_ZONE='UTC',用datetime.datetime.now()获取的时间django会把这个时间当成UTC时间存储到数据库中;

        3、如果设置USE_TZ=True与TIME_ZONE='Asia/Shanghai',用datetime.datetime.now()获取的时间由于不带时区,django会把这个时间当成Asia/Shanghai时间,即东八区时间,然后django把这个时间转化成带时区UTC时间存储到数据库中去,而读的时候直接按UTC时间读出来,这就是出现存储到数据库的时间比本地时间小8个小时。

        三、模板显示时间或读取时间

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

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

       

这篇关于datetime.now、datetime.utcnow以及Django中的timezone.now之间的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/556461

相关文章

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

Before和BeforeClass的区别及说明

《Before和BeforeClass的区别及说明》:本文主要介绍Before和BeforeClass的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Before和BeforeClass的区别一个简单的例子当运行这个测试类时总结Before和Befor

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.

Java 关键字transient与注解@Transient的区别用途解析

《Java关键字transient与注解@Transient的区别用途解析》在Java中,transient是一个关键字,用于声明一个字段不会被序列化,这篇文章给大家介绍了Java关键字transi... 在Java中,transient 是一个关键字,用于声明一个字段不会被序列化。当一个对象被序列化时,被

解读@ConfigurationProperties和@value的区别

《解读@ConfigurationProperties和@value的区别》:本文主要介绍@ConfigurationProperties和@value的区别及说明,具有很好的参考价值,希望对大家... 目录1. 功能对比2. 使用场景对比@ConfigurationProperties@Value3. 核