返回顶部
首页 > 资讯 > 后端开发 > Python >Django 中的Timezone 处理操作
  • 729
分享到

Django 中的Timezone 处理操作

2024-04-02 19:04:59 729人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

Django 中的时区 在现实环境中,存在有多个时区。用户之间很有可能存在于不同的时区,并且许多国家都拥有自己的一套夏令时系统。所以如果网站面向的是多个时区用户,只以当前时间为标准开

Django 中的时区

在现实环境中,存在有多个时区。用户之间很有可能存在于不同的时区,并且许多国家都拥有自己的一套夏令时系统。所以如果网站面向的是多个时区用户,只以当前时间为标准开发,便会在时间计算上产生错误。

为解决这个此类问题,在代码和数据库中统一使用 UTC 时间,仅在与最终用户进行交互时使用本地时间是一个很好的办法

DjanGo 默认关闭时区支持,开启时区支持,需要在 settings 中设置 USE_TZ = True 。最好同时安装 pytz 模块(pip install pytz) 。

Naive 和 Aware 类型的 datetime 对象

python 的 datatime.datetime对象有一个 tzinfo 属性,该属性是 datetime.tzinfo 子类的一个实例,他被用来存储时区信息。当某个 datetime 对象的 tzinfo 属性被设置并给出一个时间偏移量时,我们称该 datetime 对象是 aware (已知) 的。否则称其为 naive (原生) 的。

可以使用 is_aware() 和 is_naive() 函数来判断某个 datetime 对象是 aware 类型或 naive 类型。

当关闭时区时,django 使用原生的 datetime 对象保存本地时间:


import datetime
now = datetime.datetime.now()

当开启时区时,django 使用已知 (aware) 的 datetime 对象存储本地时间:


from django.utils import timezone
now = timezone.now()

Django 和 Python 中的 Timezone 处理

Django 中的 timezone


from django.utils import timezone
>>> now = timezone.now()
>>> now
datetime.datetime(2018, 2, 22, 3, 13, 2, 383795, tzinfo=<UTC>)
>>>new = timezone.localtime(now)
>>>new
datetime.datetime(2018, 2, 22, 11, 13, 2, 383795, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

Python 中的 datetime


>>>import datetime,pytz
>>>t = datetime.datetime.now()
>>>t
datetime.datetime(2018, 2, 22, 11, 18, 15, 623160)
>>>new_t = t.replace(tzinfo=(pytz.timezone('Asia/Shanghai')))
>>>new_t
datetime.datetime(2018, 2, 22, 11, 18, 15, 623160, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)

Python 中的 time/datetime

time 模块

time 模块提供各种操作时间的函数

一般有两种表示时间的方式:

第一种是时间戳的方式 (相对于1970.1.1 00:00:00以秒计算的偏移量),时间戳是唯一的


>>> import time
>>> time.time()
1519270378.989196

第二种以数组的形式表示即 (struct_time) ,共有九个元素,分别表示,同一个时间戳的 struct_time 会因为时区不同而不同


>>> time.localtime()
time.struct_time(tm_year=2018, tm_mon=2, tm_mday=22, tm_hour=11, tm_min=38, tm_sec=45, tm_wday=3, tm_yday=53, tm_isdst=0)

gmtime() 和 mktime() 可以将两种时间表示方法自由转换


>>> time.gmtime(time.time())
time.struct_time(tm_year=2018, tm_mon=2, tm_mday=22, tm_hour=11, tm_min=38, tm_sec=45, tm_wday=3, tm_yday=53, tm_isdst=0)
>>> time.mktime(time.localtime())
1519270378.989196

将 struct_time 类型与字符型自由转换 *


>>> time1 = time.strftime("%Y-%m-%d",time.localtime())
>>> time1
'2018-02-22'
>>> time2 = time.strptime(time1,"%Y-%m-%d")
time.struct_time(tm_year=2018, tm_mon=2, tm_mday=22, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=53, tm_isdst=0)

datetime 模块

datetime 模块提供多个由于操作日期时间函数

datetime 模块中定义的类:

datetime.date: 表示日期的类。常用的属性有 year,month,day;

datetime.time: 表示时间的类。常用的属性有 hour,minute,second,microsecond;

datetime.datetime: 表示日期时间。

datetime.timedelta: 表示时间间隔,即两个时间点之间的长度。

datetime.tzinfo:与时区有关的相关信息。


>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2018, 2, 22, 11, 18, 15, 623160)

datetime类型与字符串类型相互转换


>>> today = datetime.datetime.now().strftime("%Y-%m-%d")
>>> today
2018-02-22
>>> today2 = datetime.datetime.strptime(today,"%Y-%m-%d")
>>> today2
datetime.datetime(2018, 2, 22, 0, 0)

对时间间隔操作

datetime2 = datetime1 + timedelta #日期加上一个间隔,返回一个新的日期对象

datetime2 = datetime1 - timedelta #日期隔去间隔,返回一个新的日期对象

timedelta = date1 - date2 #两个日期相减,返回一个时间间隔对象

time 与 datetime 之间的相互转换

–date.fromtimestamp(timestamp):根据给定的时间戳,返回一个date对象


>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2018, 2, 22, 14, 44, 847842)

格式化代码参考表

代码 作用 代码 作用
%a 星期几的简写 %A 星期几的全称
%b 月分的简写 %B 月份的全称
%c 标准的日期的时间串 %C 年份的后两位数字
%d 十进制表示的每月的第几天 %D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天 %F 年-月-日
%g 年份的后两位数字,使用基于周的年 %G 年分,使用基于周的年
%h 简写的月份名 %H 24小时制的小时
%I 12小时制的小时 %j 十进制表示的每年的第几天
%m 十进制表示的月份 %M 十时制表示的分钟数
%n 新行符 %p 本地的AM或PM的等价显示
%r 12小时的时间 %R 显示小时和分钟:hh:mm
%S 十进制的秒数 %t 水平制表符
%T 显示时分秒:hh:mm:ss %u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
%U 第年的第几周,把星期日做为第一天(值从0到53) %V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0) %W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串 %X 标准的时间串
%y 不带世纪的十进制年份(值从0到99) %Y 带世纪部分的十制年份
%z ,%Z 时区名称,如果不能得到时区名称则返回空字符。 %% 百分号

补充:Django里面timezone.now()转时间戳/秒数的属性

Django 里timezone对象连度娘都不知道的使用技巧

今天碰到一个需求是:

Mysql中取出一个时间字段存入Redis,在前端发起请求后,将该时间字段与当前时间的差值(s)响应给前端以便于前端用作倒计时。

这里呢整个项目使用的是django框架,django在模型层定义时间字段的时候,使用的是datatimefiled(defult=timezone.now),这里存到数据库里面的是字符串,但是如果你是用django的方式取出来:Model.object.get(…………),那么你实际取到的是一个时间对象,而不是时间字符串,这个时间对象其实就是python里面的timedelta对象。

这个对象就很厉害了,它可以让你在看起来像是某年某月某天这样字符串的形式上直接做加减运算,比如,从reids里取出来的时间对象可以直接和timezone.now()相减,得出预定时间和当前时间的差值,而且这个差值还是一个时间对象,


print('========================:',cache.get('seckill_time'),'===============',timezone.now())
timeout = cache.get('seckill_time') - timezone.now()  # type:timedelta
print(timeout)

cache.get(‘seckill_time') 是从redis里面取出的时间对象

这个时间对象之所以能够直接进行加减法运算,是因为它重写了python父类里面的加减法函数,当然它还重写了很多基本运算函数,包括比较大小什么的,具体ALT+左键一点就能看见,这里看一下另外两个函数:seconds和microseconds,效果很明显,一个是忽略天数之后把剩余时间转换成秒,一个是取秒之后的小数


timeout = cache.get('seckill_time') - timezone.now()  # type:timedelta
print(timeout)
print(timeout.seconds)
print(timeout.microseconds)
--------------------------------------
1 day, 0:37:35.099737
2255
99737

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

--结束END--

本文标题: Django 中的Timezone 处理操作

本文链接: https://lsjlt.com/news/123220.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Django 中的Timezone 处理操作
    Django 中的时区 在现实环境中,存在有多个时区。用户之间很有可能存在于不同的时区,并且许多国家都拥有自己的一套夏令时系统。所以如果网站面向的是多个时区用户,只以当前时间为标准开...
    99+
    2024-04-02
  • Django 中的Timezone 解决方法
    这篇文章主要讲解了“Django 中的Timezone 解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Django 中的Timezone 解决方法”吧!Django 中的时区在现实环...
    99+
    2023-06-14
  • Python处理带timezone的da
    在存储时间类型到数据库的时候,通常使用DateTime类型。使用DateTime类型就会遇到时区timezone的问题。为了能够处理timezone, 推荐存数据库的使用存入的是基于UTC的时间日期,在本地取用的时候在转成本地时...
    99+
    2023-01-31
    Python timezone da
  • 如何理解Django ORM操作
    这篇文章主要讲解了“如何理解Django ORM操作”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Django ORM操作”吧!查询聚合操作聚合操作...
    99+
    2024-04-02
  • 怎么理解Django ORM操作
    本篇内容主要讲解“怎么理解Django ORM操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Django ORM操作”吧!表结构设计还是从实际角度出...
    99+
    2024-04-02
  • Python中怎么操作 Django
    本篇文章为大家展示了Python中怎么操作 Django,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在开发的时候发现Python Django的模板创建表单的做法确实感到有比较大的局限性,不过自定...
    99+
    2023-06-17
  • Django中有哪些CRUD操作
    这篇文章将为大家详细讲解有关Django中有哪些CRUD操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、概念crud是指增删改查,即增加(Create)、读取(Read)、更新(Upd...
    99+
    2023-06-14
  • Django项目中表的查询的操作
    目录shell操作:使用的环境:Django项目 ORM常用的十三种查询方法2022-09-29 shell操作:   我在使用中是pycharm与数据库建立连接的一个工具。 使用的...
    99+
    2024-04-02
  • Django操作cookie的实现
    前言 cookie:在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这...
    99+
    2024-04-02
  • django--ORM的单表操作
    Django--ORM单表操作创建一个新的django项目项目目录结构:Django连接数据库配置重点:第一步:修改settings.py文件DATABASES = {     &...
    99+
    2023-01-30
    操作 django ORM
  • PHP异常处理:处理异步操作中的异常
    处理异步操作中的 php 异常需要:协程中,使用 try-catch-finally 语法捕获异常。promise 中,使用 then() 和 catch() 方法处理异常。实战案例:使...
    99+
    2024-05-14
    异常处理 异步处理 swoole
  • django中操作mysql数据库的方法
    目录1.准备工作(django连接数据库)2.django操作数据库(ORM)2.1 ORM简介2.2 创建表和字段2.3 字段的增删改查2.4 单表数据的增删改查2.4.1单表数据的查询2.4.2单表数据的增加2.4....
    99+
    2024-04-02
  • Unity中的静态批处理和动态批处理操作
    前言 Unity在运行时可以将一些物体进行合并,从而用一个绘制调用来渲染他们。这一操作,我们称之为“批处理”,能得到越好的渲染性能。 Unity中内建的批处理机制所达到的效果要明显强...
    99+
    2024-04-02
  • Django图书管理系统(单表操作)
    以下内容需要掌握: Python3 以及前端:HTML,CSS,jQuery,BootStrap,Django,JavaScript 开启Django新项目: 1,settings.py  数据库选择: ①sqlite3(Django自...
    99+
    2023-01-30
    图书管理系统 操作 Django
  • Django 中的数组操作技巧大揭秘!
    Django 是一款非常流行的 Python Web 框架,它提供了许多方便的工具和技巧来帮助开发者更快更好地构建 Web 应用。其中,数组操作是 Django 中非常重要的一部分,今天我们就来揭秘一下 Django 中的数组操作技巧。 一...
    99+
    2023-08-24
    数组 django windows
  • Django 实时数据处理中,Java API 的作用和价值?
    随着数据处理需求的增加,实时数据处理已经成为了现代应用程序中必不可少的一部分。在这个过程中,Django 和 Java API 扮演着重要的角色。本文将介绍 Django 实时数据处理中 Java API 的作用和价值。 首先,我们需要了...
    99+
    2023-07-03
    api 实时 django
  • django 使用内置messages的操作
    看代码~ from django.contrib import messages messages.info(request, '要显示的字符串') 1、messages.d...
    99+
    2024-04-02
  • django操作非ORM创建的表
    django--ORM连接已存在的表问题:django的ORM怎么连接已存在的表,然后进行增删查改操作?工作中会遇见很多二次开发的时候,表都是已经创建好的,用django的ORM进行二次开发,怎么操作数据库中的表呢下面介绍一种完美解决方案:...
    99+
    2023-01-30
    操作 django ORM
  • ZooKeeper中如何处理节点的读写操作
    ZooKeeper是一个分布式协调服务,可以用于处理节点的读写操作。在ZooKeeper中,节点的读写操作主要通过ZooKeeper...
    99+
    2024-03-07
    ZooKeeper
  • Kotlin中空判断处理操作实例
    Kotlin中的一个伟大创前举就是空指针的处理,在代码的编译阶段就能检测可能出现的空指针问题,示例代码如下: data class Person(var name: String =...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作