电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Django 中的Timezone 處理操作

瀏覽:4日期:2024-09-10 17:15:48
Django 中的時(shí)區(qū)

在現(xiàn)實(shí)環(huán)境中,存在有多個(gè)時(shí)區(qū)。用戶之間很有可能存在于不同的時(shí)區(qū),并且許多國(guó)家都擁有自己的一套夏令時(shí)系統(tǒng)。所以如果網(wǎng)站面向的是多個(gè)時(shí)區(qū)用戶,只以當(dāng)前時(shí)間為標(biāo)準(zhǔn)開(kāi)發(fā),便會(huì)在時(shí)間計(jì)算上產(chǎn)生錯(cuò)誤。

為解決這個(gè)此類問(wèn)題,在代碼和數(shù)據(jù)庫(kù)中統(tǒng)一使用 UTC 時(shí)間,僅在與最終用戶進(jìn)行交互時(shí)使用本地時(shí)間是一個(gè)很好的辦法

Django 默認(rèn)關(guān)閉時(shí)區(qū)支持,開(kāi)啟時(shí)區(qū)支持,需要在 settings 中設(shè)置 USE_TZ = True 。最好同時(shí)安裝 pytz 模塊(pip install pytz) 。

Naive 和 Aware 類型的 datetime 對(duì)象

Python 的 datatime.datetime對(duì)象有一個(gè) tzinfo 屬性,該屬性是 datetime.tzinfo 子類的一個(gè)實(shí)例,他被用來(lái)存儲(chǔ)時(shí)區(qū)信息。當(dāng)某個(gè) datetime 對(duì)象的 tzinfo 屬性被設(shè)置并給出一個(gè)時(shí)間偏移量時(shí),我們稱該 datetime 對(duì)象是 aware (已知) 的。否則稱其為 naive (原生) 的。

可以使用 is_aware() 和 is_naive() 函數(shù)來(lái)判斷某個(gè) datetime 對(duì)象是 aware 類型或 naive 類型。

當(dāng)關(guān)閉時(shí)區(qū)時(shí),django 使用原生的 datetime 對(duì)象保存本地時(shí)間:

import datetimenow = datetime.datetime.now()

當(dāng)開(kāi)啟時(shí)區(qū)時(shí),django 使用已知 (aware) 的 datetime 對(duì)象存儲(chǔ)本地時(shí)間:

from django.utils import timezonenow = timezone.now()Django 和 Python 中的 Timezone 處理Django 中的 timezone

from django.utils import timezone>>> now = timezone.now()>>> nowdatetime.datetime(2018, 2, 22, 3, 13, 2, 383795, tzinfo=<UTC>)>>>new = timezone.localtime(now)>>>newdatetime.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()>>>tdatetime.datetime(2018, 2, 22, 11, 18, 15, 623160)>>>new_t = t.replace(tzinfo=(pytz.timezone(’Asia/Shanghai’)))>>>new_tdatetime.datetime(2018, 2, 22, 11, 18, 15, 623160, tzinfo=<DstTzInfo ’Asia/Shanghai’ LMT+8:06:00 STD>)Python 中的 time/datetimetime 模塊

time 模塊提供各種操作時(shí)間的函數(shù)

一般有兩種表示時(shí)間的方式:

第一種是時(shí)間戳的方式 (相對(duì)于1970.1.1 00:00:00以秒計(jì)算的偏移量),時(shí)間戳是唯一的

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

第二種以數(shù)組的形式表示即 (struct_time) ,共有九個(gè)元素,分別表示,同一個(gè)時(shí)間戳的 struct_time 會(huì)因?yàn)闀r(shí)區(qū)不同而不同

>>> 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() 可以將兩種時(shí)間表示方法自由轉(zhuǎn)換

>>> 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 類型與字符型自由轉(zhuǎn)換 *

>>> 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 模塊提供多個(gè)由于操作日期時(shí)間函數(shù)

datetime 模塊中定義的類:

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

datetime.time: 表示時(shí)間的類。常用的屬性有 hour,minute,second,microsecond;

datetime.datetime: 表示日期時(shí)間。

datetime.timedelta: 表示時(shí)間間隔,即兩個(gè)時(shí)間點(diǎn)之間的長(zhǎng)度。

datetime.tzinfo:與時(shí)區(qū)有關(guān)的相關(guān)信息。

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

datetime類型與字符串類型相互轉(zhuǎn)換

>>> today = datetime.datetime.now().strftime('%Y-%m-%d')>>> today2018-02-22>>> today2 = datetime.datetime.strptime(today,'%Y-%m-%d')>>> today2datetime.datetime(2018, 2, 22, 0, 0)對(duì)時(shí)間間隔操作

datetime2 = datetime1 + timedelta #日期加上一個(gè)間隔,返回一個(gè)新的日期對(duì)象

datetime2 = datetime1 - timedelta #日期隔去間隔,返回一個(gè)新的日期對(duì)象

timedelta = date1 - date2 #兩個(gè)日期相減,返回一個(gè)時(shí)間間隔對(duì)象

time 與 datetime 之間的相互轉(zhuǎn)換

?date.fromtimestamp(timestamp):根據(jù)給定的時(shí)間戳,返回一個(gè)date對(duì)象

>>> datetime.datetime.fromtimestamp(time.time())datetime.datetime(2018, 2, 22, 14, 44, 847842)格式化代碼參考表代碼 作用代碼 作用 %a 星期幾的簡(jiǎn)寫(xiě)%A 星期幾的全稱 %b 月分的簡(jiǎn)寫(xiě)%B 月份的全稱 %c 標(biāo)準(zhǔn)的日期的時(shí)間串%C 年份的后兩位數(shù)字 %d 十進(jìn)制表示的每月的第幾天%D 月/天/年 %e 在兩字符域中,十進(jìn)制表示的每月的第幾天%F 年-月-日 %g 年份的后兩位數(shù)字,使用基于周的年%G 年分,使用基于周的年 %h 簡(jiǎn)寫(xiě)的月份名%H 24小時(shí)制的小時(shí) %I 12小時(shí)制的小時(shí)%j 十進(jìn)制表示的每年的第幾天 %m 十進(jìn)制表示的月份%M 十時(shí)制表示的分鐘數(shù) %n 新行符%p 本地的AM或PM的等價(jià)顯示 %r 12小時(shí)的時(shí)間%R 顯示小時(shí)和分鐘:hh:mm %S 十進(jìn)制的秒數(shù)%t 水平制表符 %T 顯示時(shí)分秒:hh:mm:ss%u 每周的第幾天,星期一為第一天 (值從0到6,星期一為0) %U 第年的第幾周,把星期日做為第一天(值從0到53)%V 每年的第幾周,使用基于周的年 %w 十進(jìn)制表示的星期幾(值從0到6,星期天為0)%W 每年的第幾周,把星期一做為第一天(值從0到53) %x 標(biāo)準(zhǔn)的日期串%X 標(biāo)準(zhǔn)的時(shí)間串 %y 不帶世紀(jì)的十進(jìn)制年份(值從0到99)%Y 帶世紀(jì)部分的十制年份 %z ,%Z 時(shí)區(qū)名稱,如果不能得到時(shí)區(qū)名稱則返回空字符。%% 百分號(hào)

補(bǔ)充:Django里面timezone.now()轉(zhuǎn)時(shí)間戳/秒數(shù)的屬性

Django 里timezone對(duì)象連度娘都不知道的使用技巧今天碰到一個(gè)需求是:

從MySQL中取出一個(gè)時(shí)間字段存入redis,在前端發(fā)起請(qǐng)求后,將該時(shí)間字段與當(dāng)前時(shí)間的差值(s)響應(yīng)給前端以便于前端用作倒計(jì)時(shí)。

這里呢整個(gè)項(xiàng)目使用的是django框架,django在模型層定義時(shí)間字段的時(shí)候,使用的是datatimefiled(defult=timezone.now),這里存到數(shù)據(jù)庫(kù)里面的是字符串,但是如果你是用django的方式取出來(lái):Model.object.get(…………),那么你實(shí)際取到的是一個(gè)時(shí)間對(duì)象,而不是時(shí)間字符串,這個(gè)時(shí)間對(duì)象其實(shí)就是python里面的timedelta對(duì)象。

這個(gè)對(duì)象就很厲害了,它可以讓你在看起來(lái)像是某年某月某天這樣字符串的形式上直接做加減運(yùn)算,比如,從reids里取出來(lái)的時(shí)間對(duì)象可以直接和timezone.now()相減,得出預(yù)定時(shí)間和當(dāng)前時(shí)間的差值,而且這個(gè)差值還是一個(gè)時(shí)間對(duì)象,

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

cache.get(‘seckill_time’) 是從redis里面取出的時(shí)間對(duì)象

這個(gè)時(shí)間對(duì)象之所以能夠直接進(jìn)行加減法運(yùn)算,是因?yàn)樗貙?xiě)了python父類里面的加減法函數(shù),當(dāng)然它還重寫(xiě)了很多基本運(yùn)算函數(shù),包括比較大小什么的,具體ALT+左鍵一點(diǎn)就能看見(jiàn),這里看一下另外兩個(gè)函數(shù):seconds和microseconds,效果很明顯,一個(gè)是忽略天數(shù)之后把剩余時(shí)間轉(zhuǎn)換成秒,一個(gè)是取秒之后的小數(shù)

timeout = cache.get(’seckill_time’) - timezone.now() # type:timedeltaprint(timeout)print(timeout.seconds)print(timeout.microseconds)--------------------------------------1 day, 0:37:35.099737225599737

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 带式压滤机_污泥压滤机_污泥脱水机_带式过滤机_带式压滤机厂家-河南恒磊环保设备有限公司 | 无轨电动平车_轨道平车_蓄电池电动平车★尽在新乡百特智能转运设备有限公司 | 视频教程导航网_视频教程之家_视频教程大全_最新视频教程分享发布平台 | 【化妆品备案】进口化妆品备案流程-深圳美尚美化妆品有限公司 | 北京燃气公司 用户服务中心 | 多米诺-多米诺世界纪录团队-多米诺世界-多米诺团队培训-多米诺公关活动-多米诺创意广告-多米诺大型表演-多米诺专业赛事 | 净化车间装修_合肥厂房无尘室设计_合肥工厂洁净工程装修公司-安徽盛世和居装饰 | 土壤检测仪器_行星式球磨仪_土壤团粒分析仪厂家_山东莱恩德智能科技有限公司 | IWIS链条代理-ALPS耦合透镜-硅烷预处理剂-上海顶楚电子有限公司 lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 【官网】博莱特空压机,永磁变频空压机,螺杆空压机-欧能优 | 台式恒温摇床价格_大容量恒温摇床厂家-上海量壹科学仪器有限公司 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 | 400电话_400电话申请_866元/年_【400电话官方业务办理】-俏号网 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 新密高铝耐火砖,轻质保温砖价格,浇注料厂家直销-郑州荣盛窑炉耐火材料有限公司 | 剪刃_纵剪机刀片_分条机刀片-南京雷德机械有限公司 | 心肺复苏模拟人|医学模型|急救护理模型|医学教学模型上海康人医学仪器设备有限公司 | 磁力轮,磁力联轴器,磁齿轮,钕铁硼磁铁-北京磁运达厂家 | 沈飞防静电地板__机房地板-深圳市沈飞防静电设备有限公司 | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 水轮机密封网 | 水轮机密封产品研发生产厂家 | 合肥废气治理设备_安徽除尘设备_工业废气处理设备厂家-盈凯环保 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 污水处理设备,一体化泵站,一体化净水设备-「梦之洁环保设备厂家」 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 杭州高温泵_热水泵_高温油泵|昆山奥兰克泵业制造有限公司 | 连续油炸机,全自动油炸机,花生米油炸机-烟台茂源食品机械制造有限公司 | 青岛美佳乐清洁工程有限公司|青岛油烟管道清洗|酒店|企事业单位|学校工厂厨房|青岛油烟管道清洗 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 检验科改造施工_DSA手术室净化_导管室装修_成都特殊科室建设厂家_医疗净化工程公司_四川华锐 | 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 送料机_高速冲床送料机_NC伺服滚轮送料机厂家-东莞市久谐自动化设备有限公司 | 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 苹果售后维修点查询,苹果iPhone授权售后维修服务中心 – 修果网 拼装地板,悬浮地板厂家,悬浮式拼装运动地板-石家庄博超地板科技有限公司 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 陶氏道康宁消泡剂_瓦克消泡剂_蓝星_海明斯德谦_广百进口消泡剂 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 下水道疏通_管道疏通_马桶疏通_附近疏通电话- 立刻通 | 砖机托板价格|免烧砖托板|空心砖托板厂家_山东宏升砖机托板厂 | 深圳市东信高科自动化设备有限公司 | 诚暄电子公司首页-线路板打样,pcb线路板打样加工制作厂家 | 污水/卧式/潜水/钻井/矿用/大型/小型/泥浆泵,价格,参数,型号,厂家 - 安平县鼎千泵业制造厂 | BHK汞灯-百科|上海熙浩实业有限公司 |