Python之日期和時(shí)間包datetime的使用
1. 基本定義
1.1 時(shí)間戳
時(shí)間戳是指格林威治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總秒數(shù)(或總毫秒數(shù))。
網(wǎng)上有很多時(shí)間戳在線轉(zhuǎn)換工具,可以自行計(jì)算驗(yàn)證。
1.2 ISO日期
國(guó)際標(biāo)準(zhǔn)ISO 8601,是國(guó)際標(biāo)準(zhǔn)化組織的日期和時(shí)間的表示方法,全稱(chēng)為《數(shù)據(jù)存儲(chǔ)和交換形式·信息交換·日期和時(shí)間的表示方法》。
關(guān)于該文件可以參考:ISO 8601。ISO日期的常用格式如下:
YYYY-MM-DDThh:mm:ss[.mmm]TZD
其中各個(gè)元素說(shuō)明如下:
元素 | 說(shuō)明 |
---|---|
YYYY | 年由4位數(shù)組成,以公歷公元1年為0001年,以公元前1年為0000年,公元前2年為-0001年,其他以此類(lèi)推。 |
MM | 表示2位數(shù)的月份,從01到12 |
DD | 表示2位數(shù)的天,從01到31 |
T | 用來(lái)指示時(shí)間元素的開(kāi)始字符 |
hh | 表示兩位數(shù)的小時(shí),從00到23,不包括AM/PM |
mm | 表示兩位數(shù)的分鐘,從00到59 |
ss | 表示兩位數(shù)的秒,從00到59 |
mmm | 表示三位數(shù)的毫秒數(shù),從000到999 |
TZD | TZD表示時(shí)區(qū)指示符:Z或+hh:mm或-hh:mm,+或-表示時(shí)區(qū)距離UTC(世界標(biāo)準(zhǔn)時(shí)間)時(shí)區(qū)多遠(yuǎn)。例如,中國(guó)標(biāo)準(zhǔn)時(shí)間以北京所在的東八區(qū)位準(zhǔn),即為:+08:00 |
2. 日期date
2.1 創(chuàng)建日期
可以使用datetime中的date類(lèi)來(lái)構(gòu)建日期,其常用方法如下:
- date.fromisocalendar():使用年、周數(shù)、星期構(gòu)建日期;
- date.fromisoformat(): 使用字符串形式的ISO日期創(chuàng)建日期變量;
- date.fromordinal(): 創(chuàng)建序數(shù)對(duì)應(yīng)的日期。1對(duì)應(yīng)0001-01-01,2對(duì)應(yīng)0001-01-02,以此類(lèi)推;
- date.fromtimestamp(): 獲取時(shí)間戳對(duì)應(yīng)的日期;
- date.today(): 獲取當(dāng)前日期;
舉例如下:以下代碼中day1、day2、day3的結(jié)果均為2022-07-06,day3和day5的結(jié)果為當(dāng)前日期;
from datetime import date import time day1=date.fromisocalendar(2022,27,3) day2=date.fromisoformat('2022-07-06') day3=date.today() day4=date.fromordinal(738342) day5=date.fromtimestamp(time.time()) #time.time()獲取當(dāng)前時(shí)間的時(shí)間戳
2.2 日期常用操作
使用date創(chuàng)建的日期變量的常用屬性和方法如下:
屬性或方法 | 作用 |
---|---|
day\month\year | 獲取日期變量的年、月、日等屬性信息 |
ctime() | 將日期轉(zhuǎn)化為ctime()格式 |
isocalendar() | 將日期轉(zhuǎn)化為日歷格式 |
isoformat() | 將日期轉(zhuǎn)化為ISO 8601格式:YYYY-MM-DD |
toordinal() | 返回當(dāng)前日期的序數(shù) |
isoweekday() | 獲取當(dāng)前日期的星期數(shù),Mon=1, … \dots …,Sun=7 |
weekday() | 獲取當(dāng)前日期的星期數(shù),Mon=0, … \dots …, Sun=6 |
strftime() | 按指定格式輸出日期 |
replace() | 修改日期指定部分生成新的日期變量 |
timetuple() | 以tuple返回日期的各個(gè)部分 |
具體用法舉例如下:
from datetime import date day1=date.fromisocalendar(year=2022, week=27, day=5) #返回年/月/日 day,month,year=day1.day,day1.month,day1.year print("年:{},月:{},日:{}".format(year,month,day)) #返回星期 weekday1,weekday=day1.isoweekday(),day1.weekday() print("ISO格式的星期:{},普通格式的星期:{}".format(weekday1,weekday)) #返回指定格式的日期 str_date=day1.strftime('%Y/%m/%d') print("指定格式的日期:{}".format(str_date)) #修改日期 day2=day1.replace(year=2021) print("ctime()格式的新日期:{}".format(day2.ctime()))
其結(jié)果如下:
補(bǔ)充:strftime()中format代碼如下:
%Y Year with century as a decimal number. %m Month as a decimal number [01,12]. %d Day of the month as a decimal number [01,31]. %H Hour (24-hour clock) as a decimal number [00,23]. %M Minute as a decimal number [00,59]. %S Second as a decimal number [00,61]. %z Time zone offset from UTC. %a Locale's abbreviated weekday name. %A Locale's full weekday name. %b Locale's abbreviated month name. %B Locale's full month name. %c Locale's appropriate date and time representation. %I Hour (12-hour clock) as a decimal number [01,12]. %p Locale's equivalent of either AM or PM.
3. 時(shí)間time
datetime中的time類(lèi)提供了時(shí)間變量的定義及其常用操作。
其常用方法如下:
屬性或方法 | 作用 |
---|---|
fromisoformat() | 使用字符串形式的ISO時(shí)間創(chuàng)建時(shí)間變量 |
hour\minute\second\microsecond | 獲取時(shí)間變量的時(shí)、分、秒、毫秒屬性 |
isoformat() | 將時(shí)間變量按照ISO的時(shí)間格式輸出 |
strftime() | 將時(shí)間便變量按指定格式輸出 |
replace() | 替換時(shí)間變量的部分屬性生成新的時(shí)間變量 |
其具體用法如下:
from datetime import time #創(chuàng)建時(shí)間 t1=time.fromisoformat('07:24:38') #返回時(shí)、分、秒等信息 h,m,s=t1.hour,t1.minute,t1.second print("時(shí):{},分:{},秒:{}".format(h,m,s)) t1_str=t1.strftime('%H:%M:%S') print("指定格式的時(shí)間為:{}".format(t1_str)) t2=t1.replace(minute=45) print("ISO格式的時(shí)間為:{}".format(t2))
其結(jié)果如下:
4. 日期時(shí)間datetime
除了分別創(chuàng)建日期變量和時(shí)間變量之外,datetime中的datetime類(lèi)可以直接創(chuàng)建日期時(shí)間變量,這種變量的創(chuàng)建及其常用操作與日期變量和時(shí)間變量類(lèi)似,這里只做簡(jiǎn)單介紹。
舉例如下:
from datetime import datetime #創(chuàng)建日期時(shí)間格式 dt1=datetime.fromisoformat('2022-07-08 12:23:45') dt2=datetime.now() #當(dāng)前日期時(shí)間 #返回相關(guān)屬性 print("當(dāng)前日期時(shí)間:{}".format(dt2.isoformat())) y,m,d,h,m1,s=dt1.year,dt1.month,dt1.day,dt1.hour,dt1.minute,dt1.second print("年:{},月:{},日:{},時(shí):{},分:{},秒:{}".format(y,m,d,h,m1,s)) dt3=dt1.replace(day=1) print("指定格式的日期時(shí)間:{}".format(dt3.strftime('%Y/%m/%d %H:%M:%S')))
其結(jié)果如下:
其他常用方法如下:
方法 | 作用 |
---|---|
strptime() | 將字符串按照指定的格式轉(zhuǎn)化為日期時(shí)間變量 |
timestamp() | 返回日期對(duì)應(yīng)的時(shí)間戳值 |
utcfromtimestamp() | 將POSIX時(shí)間戳轉(zhuǎn)化為UTC日期時(shí)間 |
utcnow() | 返回當(dāng)前日期時(shí)間 |
這里有一點(diǎn)要說(shuō)明,datetime包中的ISO日期格式似乎與ISO 8601中的格式不完全一致,datetime中的ISO日期格式為:YYYY-MM-DDT[HH[:MM[:SS[.mmm[uuu]]]]][+HH:MM],這里不能使用時(shí)區(qū)指示’Z’。
具體如下:
5. 時(shí)間長(zhǎng)度timedelta
時(shí)間長(zhǎng)度timedelta表示兩個(gè)日期或日期時(shí)間類(lèi)型變量的差值。
其使用如下:
from datetime import date,time,datetime,timedelta date1=date.fromisoformat('2022-07-06') date2=date.fromisoformat('2022-08-13') td1=date2-date1 print(td1) dt1=datetime.fromisoformat('2022-08-13T13:32:23+08:00') dt2=datetime.fromisoformat('2022-08-13T12:23:34+08:00') td2=dt2-dt1 print(td2)
其結(jié)果如下:
這里要注意,計(jì)算兩個(gè)datetime變量的時(shí)間長(zhǎng)度時(shí),datetime變量必須在同一個(gè)時(shí)區(qū),否則會(huì)報(bào)錯(cuò):
can’t subtract offset-naive and offset-aware datetimes
具體如下:
在上述案例中,dt1表示的是東八區(qū)的時(shí)間,dt2是世界協(xié)調(diào)時(shí)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python基于詞頻排序?qū)崿F(xiàn)快速挖掘關(guān)鍵詞
這篇文章主要為大家詳細(xì)介紹了Python如何基于詞頻排序?qū)崿F(xiàn)快速挖掘關(guān)鍵詞功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-03-03python2.7讀取文件夾下所有文件名稱(chēng)及內(nèi)容的方法
python,本身來(lái)說(shuō)是一門(mén)高級(jí)編程語(yǔ)言,python它入門(mén)簡(jiǎn)單,有基礎(chǔ)的學(xué)起來(lái)很快就能有簡(jiǎn)單的應(yīng)用,但是在非常高的抽象計(jì)算中,高級(jí)的python程序設(shè)計(jì)也是非常難學(xué)的。接下來(lái)給大家介紹python2.7讀取文件夾下所有文件名稱(chēng)及內(nèi)容的方法,一起看看吧2018-02-02Python實(shí)現(xiàn)定時(shí)執(zhí)行任務(wù)的三種方式簡(jiǎn)單示例
這篇文章主要介紹了Python實(shí)現(xiàn)定時(shí)執(zhí)行任務(wù)的三種方式,結(jié)合簡(jiǎn)單實(shí)例形式分析了Python使用time,os,sched等模塊定時(shí)執(zhí)行任務(wù)的相關(guān)操作技巧,需要的朋友可以參考下2019-03-03淺談python requests 的put, post 請(qǐng)求參數(shù)的問(wèn)題
今天小編就為大家分享一篇淺談python requests 的put, post 請(qǐng)求參數(shù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01基于Python3.6+splinter實(shí)現(xiàn)自動(dòng)搶火車(chē)票
這篇文章主要為大家詳細(xì)介紹了基于Python3.6+splinter實(shí)現(xiàn)自動(dòng)搶火車(chē)票,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09關(guān)于flask路由app.route及路由參數(shù)的各種用法解析
我們?cè)陂_(kāi)發(fā)過(guò)程中,編寫(xiě)項(xiàng)目時(shí)所使用的路由往往是指代了框架/項(xiàng)目中用于完成路由功能的類(lèi),這個(gè)類(lèi)一般就是路由類(lèi),簡(jiǎn)稱(chēng)路由,這篇文章主要介紹了有關(guān)flask路由app.route及路由參數(shù)的各種用法解析,需要的朋友可以參考下2024-03-03