在Python中,與時間處理有關(guān)的模塊就包括:time,datetime以及calendar泻红。這篇文章,主要講解time模塊霞掺。
日期時間基本知識
- 在Python中谊路,通常有這幾種方式來表示時間:
- 時間戳
- 格式化的時間字符串
- 元組(struct_time)共九個元素
由于Python的time模塊實現(xiàn)主要調(diào)用C庫,所以各個平臺可能有所不同菩彬。
- UTC(Coordinated Universal Time缠劝,世界協(xié)調(diào)時)亦即格林威治天文時間潮梯,世界標(biāo)準(zhǔn)時間。在中國為UTC+8惨恭。DST(Daylight Saving Time)即夏令時秉馏。
- 時間戳(timestamp)的方式:通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量脱羡。我們運行
type(time.time())
萝究,返回的是float類型。返回時間戳方式的函數(shù)主要有time()锉罐,clock()等帆竹。 - 元組(struct_time)方式:struct_time元組共有9個元素,返回struct_time的函數(shù)主要有g(shù)mtime()脓规,localtime()栽连,strptime()。下面列出這種方式元組中的幾個元素:
索引 | 屬性 | 值 |
---|---|---|
0 | tm_year(年) | 比如:2011 |
1 | tm_mon(月) | 1-12 |
函數(shù)說明
1) time.localtime([secs]):將一個時間戳轉(zhuǎn)換為當(dāng)前時區(qū)的struct_time侨舆。secs參數(shù)未提供秒紧,則以當(dāng)前時間為準(zhǔn)。
>>> time.localtime()
time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=14, tm_min=14, tm_sec=50, tm_wday=3, tm_yday=125, tm_isdst=0)
>>> time.localtime(1304575584.1361799)
time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=14, tm_min=6, tm_sec=24, tm_wday=3, tm_yday=125, tm_isdst=0)
2)time.gmtime(****[secs]****)**:和localtime()方法類似挨下,gmtime()方法是將一個時間戳轉(zhuǎn)換為UTC時區(qū)(0時區(qū))的struct_time熔恢。
>>>time.gmtime()
time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=6, tm_min=19, tm_sec=48, tm_wday=3, tm_yday=125, tm_isdst=0)
3)time.time():返回當(dāng)前時間的時間戳。
>>> time.time()
1304575584.1361799
4)time.mktime(t)**:將一個struct_time轉(zhuǎn)化為時間戳臭笆。
>>> time.mktime(time.localtime())
1304576839.0
5)time.sleep(secs):線程推遲指定的時間運行叙淌。單位為秒。
6)time.clock():這個需要注意耗啦,在不同的系統(tǒng)上含義不同**凿菩。在UNIX系統(tǒng)上机杜,它返回的是“進程時間”帜讲,它是用秒表示的浮點數(shù)(時間戳)。而在WINDOWS中椒拗,第一次調(diào)用似将,返回的是進程運行的實際時間。而第二次之后的調(diào)用是自第一次調(diào)用以后到現(xiàn)在的運行時間蚀苛。(實際上是以WIN32上QueryPerformanceCounter()為基礎(chǔ)在验,它比毫秒表示更為精確)
import time
if __name__ == '__main__':
time.sleep(1)
print "clock1:%s" % time.clock()
time.sleep(1)
print "clock2:%s" % time.clock()
time.sleep(1)
print "clock3:%s" % time.clock()
運行結(jié)果:
clock1:3.35238137808e-006
clock2:1.00004944763
clock3:2.00012040636
7)time.asctime([t]):把一個表示時間的元組或者struct_time表示為這種形式:'Sun Jun 20 23:21:05 1993'**。如果沒有參數(shù)堵未,將會將time.localtime()作為參數(shù)傳入腋舌。
>>> time.asctime()'Thu May 5 14:55:43 2011'
8)time.ctime([secs])**:把一個時間戳(按秒計算的浮點數(shù))轉(zhuǎn)化為time.asctime()的形式。如果參數(shù)未給或者為None的時候渗蟹,將會默認(rèn)time.time()為參數(shù)块饺。它的作用相當(dāng)于
time.asctime(time.localtime(secs))赞辩。
>>> time.ctime()'Thu May 5 14:58:09 2011'
>>> time.ctime(time.time())'Thu May 5 14:58:39 2011'
>>> time.ctime(1304579615)'Thu May 5 15:13:35 2011'
9)time.strftime(format[, t])**:把一個代表時間的元組或者struct_time(如由time.localtime()和time.gmtime()返回)轉(zhuǎn)化為格式化的時間字符串。如果t未指定授艰,將傳入time.localtime()辨嗽。如果元組中任何一個元素越界,ValueError的錯誤將會被拋出淮腾。
備注:
“%p”只有與“%I”配合使用才有效果糟需。
文檔中強調(diào)確實是0 - 61,而不是59谷朝,閏年秒占兩秒(汗一個)洲押。
當(dāng)使用strptime()函數(shù)時,只有當(dāng)在這年中的周數(shù)和天數(shù)被確定的時候%U和%W才會被計算徘禁。
舉個例子:
>>> time.strftime("%Y-%m-%d %X", time.localtime())'2011-05-05 16:37:06'
10)time.strptime(string[, format])**:把一個格式化時間字符串轉(zhuǎn)化為struct_time诅诱。實際上它和strftime()是逆操作。
>>> time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X')
time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=16, tm_min=37, tm_sec=6, tm_wday=3, tm_yday=125, tm_isdst=-1)
在這個函數(shù)中送朱,format默認(rèn)為:"%a %b %d %H:%M:%S %Y"娘荡。
最后,我們來對time模塊進行一個總結(jié)驶沼。
根據(jù)之前描述炮沐,在Python中共有三種表達(dá)方式:1)timestamp 2)tuple或者struct_time 3)格式化字符串。
官方文檔翻譯3.5.1
time-時間獲取和轉(zhuǎn)化
這個模塊提供了一些與時間相關(guān)的方法.更多相關(guān)功能請參考datetime
和calendar
模塊.
雖然這個模塊一直都可用,但并不是所有方法都可以在所有平臺上都可用.在這個模塊中大多數(shù)方法是調(diào)用C語言的同名庫.有時侯參考平臺文檔更有用,因為一些方法的語義隨平臺不同而不同.
下面是一些技術(shù)解釋和約定:
- 紀(jì)云是一個時間開始的地方.'0'意味著某年1月1日零點,在Unix上是1970年,使用
gmtime(0)
來獲取這個紀(jì)云.
>>> import time
>>> time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
- 此模塊中的方法可能無法處理紀(jì)元前或遙遠(yuǎn)的未來的日期和時間.更遠(yuǎn)未來分界點是由C庫決定的,對于32位系統(tǒng)來說,典型的是2038年.
- 2000年問題(y2k),Python依賴于C語言庫,一般來說沒有2000年問題,因為所有的日期和時間在內(nèi)部表示為自紀(jì)元秒.方法
strptime()
使用%y格式可以解析2位數(shù)的年份回怜。當(dāng)2位數(shù)字的年份被解析大年,他們是根據(jù)POSIX和ISO C標(biāo)準(zhǔn)轉(zhuǎn)換:值69-99被映射到1969年至1999年,值0-68被映射到2000至2068年玉雾。 - UTC是代表世界時間(前身為格林威治時間翔试,或GMT)「囱縮寫UTC是不是一個錯誤垦缅,它是英語和法語之間的妥協(xié).
- DST是夏令時,(通常情況下)在不同時區(qū)調(diào)整一年中的小時驹碍。 DST規(guī)則是魔術(shù)(由當(dāng)?shù)胤纱_定)壁涎,可以每年都在變化。 C庫有一個包含本地規(guī)則的表(通常是從靈活的系統(tǒng)文件中讀戎就骸)怔球,是真正的智慧在這方面的唯一來源。
- 各種實時函數(shù)的精確度可能小于由其中它們的值或參數(shù)所表示的單位浮还。 例如竟坛。在大多數(shù)Unix系統(tǒng)中,時鐘“滴答”只有50或100次。
- 另一方面,
time()
和sleep()
精度要優(yōu)于Unix,時間被表示為否點數(shù),time()
返回最精確時間(使用Unix的gettimeofday()
如果有的話),sleep()
接受一個非零的分?jǐn)?shù)(Unix使用select()來實現(xiàn),如果有的話). - 時間值是由gmtime()
,localtime()
, strptime()
,和通過傳遞參數(shù) asctime()
, mktime()
and strftime()
的方法返回的9個序列. gmtime()
, localtime()
, 和strptime()
的返回值也提供各個字段名屬性.
請參考struct_time
對象描述.
Changed in version 3.3:struct_time
擴展提供了tm_gmtoff
和tm_zone
屬性當(dāng)平臺支持相應(yīng)的struct tm
成員時. - 使用下面的函數(shù)轉(zhuǎn)換:
這個模塊定義了如下方法和數(shù)據(jù)項: