Python中的時(shí)間處理大總結(jié)

python中處理時(shí)間的模塊有三個(gè)鸵赫,datetime, time,calendar抵蚊,融匯貫通三個(gè)模塊航邢,才能隨心所欲地用python處理時(shí)間耕赘。本文就是為此而寫(xiě),文章著重點(diǎn)在于梳理出三個(gè)模塊的設(shè)計(jì)脈絡(luò)膳殷,便于大家記憶里面的api操骡。在需要的時(shí)候能夠去查找相應(yīng)的方法九火。但由于calendar模塊使用不多,限于篇幅册招,本文沒(méi)有涉及岔激。

1.概述

datetime模塊主要是用來(lái)表示日期的,就是我們常說(shuō)的年月日時(shí)分秒是掰,calendar模塊主要是用來(lái)表示年月日虑鼎,是星期幾之類的信息,time模塊主要側(cè)重點(diǎn)在時(shí)分秒键痛,粗略從功能來(lái)看炫彩,我們可以認(rèn)為三者是一個(gè)互補(bǔ)的關(guān)系,各自專注一塊絮短。方便用戶依據(jù)不同的使用目的選用趁手的模塊江兢。

2.從time模塊說(shuō)起

為了學(xué)習(xí)time模塊,我們需要先知道幾個(gè)與時(shí)間相關(guān)的概念:

1)丁频,epoch

假設(shè)我們要將時(shí)間表示成毫秒數(shù)杉允,比方說(shuō)1000000毫秒,那有一個(gè)問(wèn)題必須解決席里,這個(gè)1000000毫秒的起點(diǎn)是什么時(shí)間叔磷,也就是我們的時(shí)間基準(zhǔn)點(diǎn)是什么時(shí)間?好比我說(shuō)你身高1.8米奖磁,那這個(gè)身高是指相對(duì)于你站立的地面說(shuō)的世澜。這個(gè)時(shí)間基準(zhǔn)點(diǎn)就是epoch,在Unix系統(tǒng)中署穗,這個(gè)基準(zhǔn)點(diǎn)就是1970年1月1日0點(diǎn)整那個(gè)時(shí)間點(diǎn)寥裂。

2),GMT, UTC

上面我們說(shuō)epoch表示1970年的起始點(diǎn),那這個(gè)1970年又是相對(duì)于哪個(gè)基準(zhǔn)時(shí)間呢案疲?一般來(lái)說(shuō)封恰,就是相對(duì)于格林尼治時(shí)間,也叫做GMT(Greenwich Mean Time)時(shí)間褐啡,還叫做UTC(Coordinated Universal Time)诺舔,為啥一個(gè)時(shí)間基準(zhǔn)有兩個(gè)名字?歷史上备畦,先有的GMT,后有的UTC.

UTC是我們現(xiàn)在用的時(shí)間標(biāo)準(zhǔn)低飒,GMT是老的時(shí)間計(jì)量標(biāo)準(zhǔn)。UTC是根據(jù)原子鐘來(lái)計(jì)算時(shí)間懂盐,而GMT是根據(jù)地球的自轉(zhuǎn)和公轉(zhuǎn)來(lái)計(jì)算時(shí)間褥赊。

所以,可以認(rèn)為UTC是真正的基準(zhǔn)時(shí)間莉恼,GMT相對(duì)UTC的偏差為0拌喉。

在實(shí)際中速那,我們的計(jì)算機(jī)中有一個(gè)硬件模塊RCT,里面會(huì)實(shí)時(shí)記錄UTC 時(shí)間尿背,該模塊有單獨(dú)的電池供電端仰,即使關(guān)機(jī)也不影響。

有了epoch這個(gè)時(shí)間基準(zhǔn)田藐,又有了UTC這個(gè)基準(zhǔn)的基準(zhǔn)荔烧,我們就可以精確地表示一個(gè)時(shí)間了。

3),DST, tzone

盡管我們已經(jīng)可以精確地表示一個(gè)時(shí)間汽久,很多情況下鹤竭,我們還是要根據(jù)地區(qū)實(shí)際情況對(duì)時(shí)間進(jìn)行一個(gè)調(diào)整,最常見(jiàn)的就是時(shí)區(qū)回窘,tzone诺擅,相信大家都比較熟悉市袖。

此時(shí)啡直,當(dāng)我們說(shuō)5點(diǎn)5分這個(gè)時(shí)間時(shí),還需加上是哪個(gè)時(shí)區(qū)的5點(diǎn)5分才能精確說(shuō)明一個(gè)時(shí)間苍碟。

另外一個(gè)對(duì)時(shí)間做出調(diào)整的就是DST.

DST 全稱是Daylight Saving Time酒觅,是說(shuō),為了充分利用日光微峰,減少用電舷丹,人為地對(duì)時(shí)間做出一個(gè)調(diào)整,這取決于不同國(guó)家和地區(qū)的政策法規(guī)蜓肆。比如說(shuō)颜凯,假設(shè)你冬天7點(diǎn)天亮起床,但夏天6點(diǎn)天亮仗扬,那么在夏天到來(lái)時(shí)人為將時(shí)間加1個(gè)小時(shí)症概,這樣就可以讓你還是覺(jué)得7點(diǎn)起床,但實(shí)際上是提前一個(gè)小時(shí)了早芭。

那么彼城,好奇的我們,一定要問(wèn)一問(wèn)退个,python是如何知道tzone和DST這兩個(gè)的值呢募壕?答案是通過(guò)環(huán)境變量。

這里我們只以linux為例來(lái)說(shuō)明一下语盈。

在linux中有TZ環(huán)境變量舱馅,其值類似這樣:

CST+08EDT,M4.1.0,M10.5.0,這個(gè)字符串可以做如下解讀刀荒,用空格分開(kāi)他們习柠,分成三部分

CST+08 EDT, M4.1.0,M10.5.0

第一部分中的CST表示時(shí)區(qū)的名字匀谣,即China Standard Time,也就是我們說(shuō)的北京時(shí)間资溃,+8表示北京時(shí)間減去8小時(shí)就是UTC時(shí)間

第二部分EDT表示DST的名字武翎,我們說(shuō)DST是因各個(gè)國(guó)家地區(qū)的政策法規(guī)不同而不同的,EDT后面也可以像CST后面一樣加一個(gè)時(shí)間調(diào)整值溶锭,但由于我們國(guó)內(nèi)只在86年到92年實(shí)行過(guò)一段時(shí)間DST宝恶,現(xiàn)在已經(jīng)廢止,所以后面不用加調(diào)整時(shí)間趴捅。

第三部分表示的是實(shí)行DST的開(kāi)始和結(jié)束時(shí)間垫毙,我們就不細(xì)解讀了。

4)拱绑,時(shí)間的表示综芥,獲取,轉(zhuǎn)換

time模塊中獲取時(shí)間的基本方法是

t = time.time()

它返回的是從epoch到現(xiàn)在的秒數(shù)(用浮點(diǎn)數(shù)表示)猎拨,用的是UTC時(shí)間膀藐。

我們自然而然地想把這個(gè)秒數(shù)轉(zhuǎn)為年月日時(shí)分秒的形式,而這種轉(zhuǎn)換又分兩種红省,一種還是用UTC時(shí)間额各,一種用我們所在時(shí)區(qū)進(jìn)行調(diào)整后的時(shí)間。

time模塊給我們提供了兩個(gè)方法吧恃,

time. gmtime(t)
time.localtime(t)

二者都返回一個(gè)類struct_time的實(shí)例虾啦,該實(shí)例具有如下屬性:

Python中的時(shí)間處理大總結(jié)

相比用秒數(shù)表示的時(shí)間,這樣的表示更適合我們理解痕寓。

這兩個(gè)函數(shù)如果調(diào)用時(shí)不傳參數(shù)傲醉,它們內(nèi)部會(huì)調(diào)用time.time(),并用返回的秒數(shù)做轉(zhuǎn)換呻率。

相反的硬毕,python同樣提供了將這兩種struct_time轉(zhuǎn)為秒數(shù)的方法。

calendar.timegm()方法用來(lái)把UTC的struct_time(gmtime的返回對(duì)象)轉(zhuǎn)為從epoch開(kāi)始的秒數(shù)

time.mktime()用來(lái)把用時(shí)區(qū)調(diào)整過(guò)的struct_time(即localtime的返回對(duì)象)對(duì)象轉(zhuǎn)為從epoch開(kāi)始的秒數(shù)

也就是說(shuō)mktime方法會(huì)先找到系統(tǒng)中的時(shí)區(qū)和DST信息筷凤,并利用這個(gè)信息對(duì)struct_time進(jìn)行調(diào)整后再換算成秒數(shù)昭殉。

另一種常見(jiàn)的需求是在時(shí)間和表示時(shí)間的字符串之間進(jìn)行轉(zhuǎn)換。

time模塊中的strftime和strptime就是做這個(gè)用的藐守。

看名字大家就應(yīng)該知道它們的含義挪丢,

strftime 即 string format time,用來(lái)將時(shí)間格式化成字符串

strptime 即string parse time卢厂,用來(lái)將字符串解析成時(shí)間乾蓬。

需要注意的是,這里的時(shí)間都是struct_time對(duì)象慎恒。

關(guān)于怎么格式化時(shí)間任内,是很簡(jiǎn)單的知識(shí)撵渡,這里就借用官網(wǎng)文檔的內(nèi)容了。

Python中的時(shí)間處理大總結(jié)

除了這兩個(gè)函數(shù)死嗦,time模塊中還提供了兩個(gè)簡(jiǎn)便方法趋距,來(lái)幫助將時(shí)間轉(zhuǎn)為字符串

asctime用來(lái)將一個(gè)struct_time對(duì)象轉(zhuǎn)為標(biāo)準(zhǔn)24字符的字符串,如下所示:

Sun Jun 20 23:21:05 1993

ctime方法與asctime作用相同越除,只不過(guò)它接收的是秒數(shù)节腐,在內(nèi)部,會(huì)先把秒數(shù)通過(guò)localtime轉(zhuǎn)為struct_time摘盆,再往后就與asctime一樣了翼雀。

以上就是time模塊的核心內(nèi)容,我嘗試用一個(gè)口訣幫助記憶這些API

time點(diǎn)time得秒數(shù)

傳入gm, local time得struct_time

要想變回原秒數(shù)

你得傳回calendar.timegm和time. mktime

string f和string p

格式化時(shí)間靠哥倆

你要還是嫌費(fèi)事

asctime ,ctime來(lái)助力

專門(mén)幫你轉(zhuǎn)字符串

前者接收struct_time

后者專門(mén)處理秒數(shù)

分工合作不費(fèi)力

學(xué)好time模塊基本功

做個(gè)時(shí)間的明白人孩擂!

下面狼渊,我們要開(kāi)始學(xué)習(xí)datetime模塊。

3.datetime模塊

1)类垦,概覽

time模塊解決了時(shí)間的獲取和表示狈邑,datetime模塊則進(jìn)一步解決了快速獲取并操作時(shí)間中的年月日時(shí)分秒信息的能力。

簡(jiǎn)單說(shuō)护锤,該模塊核心的類就三個(gè)官地,date類表示年月日酿傍,time類表示時(shí)分秒毫秒烙懦,這里不要和time模塊搞混淆了。一句順口溜可以幫助記清這個(gè)情況:

time里面沒(méi)time

藏在datetime里

編的是不是不咋地赤炒?嗯氯析,我也這么覺(jué)得。

datetime類就是date和time的組合莺褒。

有一點(diǎn)需要提前說(shuō)明一下掩缓,time類和datetime類都有一個(gè)屬性,它的值是一個(gè)tzinfo對(duì)象遵岩,里面包含了該time或者datetime的時(shí)區(qū)信息你辣,一般稱這個(gè)time或者datetime對(duì)象是aware的,它能夠準(zhǔn)確換算成自epoch開(kāi)始的秒數(shù)尘执。

如果該屬性設(shè)置為None舍哄,那么,這時(shí)的time對(duì)象或者datetime對(duì)象就沒(méi)有時(shí)區(qū)信息誊锭,具體它表示的是local time還是utc time表悬,需要我們自己在程序中去決定。

這里我們所說(shuō)的local time是指我們所在時(shí)區(qū)的時(shí)間丧靡, utc time指的就是國(guó)際標(biāo)準(zhǔn)時(shí)間蟆沫,也就是格林尼治時(shí)間籽暇。下文同。

請(qǐng)記住一點(diǎn)饭庞,date中是沒(méi)有時(shí)區(qū)信息的戒悠。

2),從創(chuàng)建datetime開(kāi)始

創(chuàng)建datetime對(duì)象舟山,我最常用的辦法如下

dt=datetime.datetime.fromtimestamp(time.time())

以上救崔,time.time()獲得自epoch開(kāi)始的秒數(shù),fromtimestamp方法會(huì)將這個(gè)秒數(shù)轉(zhuǎn)變成一個(gè)datetime對(duì)象捏顺。

這里有一個(gè)問(wèn)題六孵,這個(gè)datetime對(duì)象究竟是utc的還是local的?

答案是local的幅骄,這是該方法的默認(rèn)行為劫窒。如果你在fromtimestamp方法中傳入一個(gè)表示時(shí)區(qū)的參數(shù),即tzinfo對(duì)象拆座,就會(huì)按傳入的時(shí)區(qū)信息進(jìn)行轉(zhuǎn)換主巍。

獲得表示當(dāng)前l(fā)ocal時(shí)間的datetime對(duì)象,還有兩個(gè)簡(jiǎn)便方法

datetime. datetime. now()
datetime. datetime. today()

以上我們得到的都是local的datetime對(duì)象挪凑,如何獲得utc的datetime對(duì)象呢孕索?有兩個(gè)辦法

datetime. datetime. utcfromtimestamp()
datetime. datetime. utcnow()

我們還可以從字符串中創(chuàng)建datetime對(duì)象,

方法為datetime.striptime(date_string, format)

其內(nèi)部還是先調(diào)用的time模塊中的striptime方法躏碳,獲取struct_time對(duì)象搞旭,再利用struct_time對(duì)象中的年月日時(shí)分秒信息構(gòu)建datetime對(duì)象。

同樣的菇绵,datetime類也提供了strftime()肄渗,asctime(),ctime()方法咬最,相信不說(shuō)你也知道是做什么的了翎嫡。

datetime類還提供了一個(gè)combine方法,用來(lái)將一個(gè)date對(duì)象和一個(gè)time對(duì)象組合成一個(gè)datetime對(duì)象永乌。

需要注意的是惑申,datetime模塊中出現(xiàn)timestamp時(shí),一般可將其理解成time.time()返回的秒數(shù)

3)翅雏,date和time的創(chuàng)建

date對(duì)象的創(chuàng)建和datetime非常相似圈驼,

datetime. date. today()

datetime.date.fromtimestamp()都可以創(chuàng)建一個(gè)date對(duì)象。

當(dāng)然枚荣,你也可以通過(guò)構(gòu)造方法傳入年月日來(lái)創(chuàng)建date對(duì)象碗脊。

相比之下,time對(duì)象的創(chuàng)建就很有限,只能通過(guò)

datetime.time([hour[, minute[, second[, microsecond[, tzinfo]]]]])

這個(gè)方法創(chuàng)建衙伶。

4)祈坠,以上三個(gè)對(duì)象的操作和timedelta類

在實(shí)際使用中,我們有一大塊需求就是對(duì)日期進(jìn)行比較和加減運(yùn)算矢劲。得益于python的操作符重載能力赦拘,python中可以方便地對(duì)date對(duì)象之間,或者datetime對(duì)象之間進(jìn)行小于(<)比較和減法(-)操作芬沉。

注意躺同,這里僅限于同類對(duì)象之間,而且丸逸,不包括time對(duì)象之間蹋艺。

兩個(gè)date對(duì)象作減,或者兩個(gè)datetime對(duì)象之間作減黄刚,差值用一個(gè)timedelta對(duì)象表示捎谨。

同理,一個(gè)date 對(duì)象或者datetime對(duì)象也可以加或者減一個(gè)timedelta對(duì)象憔维。

一個(gè)timedelta對(duì)象含有三個(gè)屬性:days,seconds,

microseconds,days屬性可以取負(fù)值涛救,另外兩個(gè)屬性都只能是正值。

你可以用total_seconds()方法獲得一個(gè)timedelta對(duì)象的秒數(shù)表示业扒。

兩個(gè)timedelta對(duì)象之間可加检吆,可減,但不能做大小比較程储,因?yàn)檫@樣沒(méi)什么意義蹭沛。

一個(gè)timedelta對(duì)象還可以與整數(shù)相乘,或通過(guò)//操作與一個(gè)整數(shù)相除虱肄。

還可以取反致板,或者用abs函數(shù)獲得絕對(duì)值

4.無(wú)總結(jié)交煞,不進(jìn)步

本文的目的不在于詳細(xì)說(shuō)明python處理時(shí)間日期的api如何使用咏窿,而是想通過(guò)一個(gè)概覽的形式,讓大家抓住time和datetime模塊的設(shè)計(jì)結(jié)構(gòu)素征,從而能夠清楚這些模塊提供了哪些能力集嵌,在需要的時(shí)候能夠想起來(lái)去用,至于查詳細(xì)的api御毅,應(yīng)該是可以輕松解決的根欧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市端蛆,隨后出現(xiàn)的幾起案子凤粗,更是在濱河造成了極大的恐慌,老刑警劉巖今豆,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫌拣,死亡現(xiàn)場(chǎng)離奇詭異柔袁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)异逐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)捶索,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人灰瞻,你說(shuō)我怎么就攤上這事腥例。” “怎么了酝润?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵燎竖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我要销,道長(zhǎng)底瓣,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任蕉陋,我火速辦了婚禮捐凭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凳鬓。我一直安慰自己茁肠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布缩举。 她就那樣靜靜地躺著垦梆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仅孩。 梳的紋絲不亂的頭發(fā)上托猩,一...
    開(kāi)封第一講書(shū)人閱讀 49,856評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音辽慕,去河邊找鬼京腥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛溅蛉,可吹牛的內(nèi)容都是我干的公浪。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼船侧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼欠气!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起镜撩,我...
    開(kāi)封第一講書(shū)人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤预柒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宜鸯,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡人灼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了顾翼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片投放。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖适贸,靈堂內(nèi)的尸體忽然破棺而出灸芳,到底是詐尸還是另有隱情,我是刑警寧澤拜姿,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布烙样,位于F島的核電站,受9級(jí)特大地震影響蕊肥,放射性物質(zhì)發(fā)生泄漏谒获。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一壁却、第九天 我趴在偏房一處隱蔽的房頂上張望批狱。 院中可真熱鬧,春花似錦展东、人聲如沸赔硫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爪膊。三九已至,卻和暖如春砸王,著一層夾襖步出監(jiān)牢的瞬間推盛,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工谦铃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耘成,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓荷辕,卻偏偏與公主長(zhǎng)得像凿跳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疮方,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容