Python時間模塊之Time模塊解析
在我們平常的代碼中,經常需要和時間打交道。在Python中,與時間處理相關的模塊有:time、datetime以及calendar。學會計算時間,對程序的調優非常重要,可以在程序中狂打時間戳,來具體判斷程序中哪一塊耗時最多,從而找到程序調優的重心處。這裏先來講一個time模塊。
在開始前,先說明幾點:
- 在Python中,通常有這幾種方式表示時間:時間戳、格式化的時間字符串、元組(struct_time 共九種元素)。由於Python的time模塊主要是調用C庫實現的,所以在不同的平臺可能會有所不同。
- 時間戳(timestamp)的方式:時間戳表示是從1970年1月1號 00:00:00開始到現在按秒計算的偏移量。查看一下type(time.time())的返回值類型,可以看出是float類型。返回時間戳的函數主要有time()、clock()等。
- UTC(世界協調時),就是格林威治天文時間,也是世界標準時間。在中國為UTC+8。DST夏令時。
- 元組方式:struct_time元組共有9個元素,返回struct_time的函數主要有gmtime(),localtime(),strptime()。
>>> import time >>> ls = time.localtime() >>> ls time.struct_time(tm_year=2015, tm_mon=8, tm_mday=24, tm_hour=9, tm_min=39, tm_sec=38, tm_wday=0, tm_yday=236, tm_isdst=0)
直接使用元組索引獲取對應項的值:
>>> ls[0] 2015 >>> ls[1] 8 >>> ls[-1] 0
或者是使用成員符號調用:
>>> ls.tm_year
2015
既然是一個元組,那麽就遵循元組的所有特性,比如索引(都從0開始),切片等。下面元組中各元素的解釋:
tm_year :年 tm_mon :月(1-12) tm_mday :日(1-31) tm_hour :時(0-23) tm_min :分(0-59) tm_sec :秒(0-59) tm_wday :星期幾(0-6,0表示周日) tm_yday :一年中的第幾天(1-366) tm_isdst :是否是夏令時(默認為-1)
time模塊中常用的函數
使用該模塊中的函數時,必須先引入該模塊(import time)
1、time.time():返回當前時間的時間戳
>>> time.time() 1440337405.85 #對時間戳取整 >>> int(time.time()) 1440746424
2、time.localtime( [secs] )
將一個時間戳轉換為當前時區的struct_time,即時間數組格式的時間
參數:
- sec – 轉換為time.struct_time類型的對象的秒數
如果secs參數未提供,則以當前時間為準(即會默認調用time.time())。
未給定參數
>>> time.localtime()
time.struct_time(tm_year=2015, tm_mon=8, tm_mday=23, tm_hour=21, tm_min=49, tm_sec=27, tm_wday=6, tm_yday=235, tm_isdst=0)
給定參數
>>> time.localtime(1440337405.85)
time.struct_time(tm_year=2015, tm_mon=8, tm_mday=23, tm_hour=21, tm_min=43, tm_sec=25, tm_wday=6, tm_yday=235, tm_isdst=0)
3、time.gmtime([secs])
將一個時間戳轉換為UTC時區的struct_time
time.gmtime() 函數將一個時間戳轉換為UTC時區(0時區)的struct_time,可選的參數sec表示從1970-1-1
00:00:00以來的秒數。其默認值為time.time(),函數返回time.struct_time類型的對象。(struct_time是在time模塊中定義的表示時間的對象)。
如果secs參數未提供,則以當前時間為準。
參數:
- sec – 轉換為time.struct_time類型的對象的秒數
>>> time.gmtime() time.struct_time(tm_year=2015, tm_mon=8, tm_mday=23, tm_hour=13, tm_min=55, tm_sec=43, tm_wday=6, tm_yday=235, tm_isdst=0) >>> time.gmtime(1440337405.85) time.struct_time(tm_year=2015, tm_mon=8, tm_mday=23, tm_hour=13, tm_min=43, tm_sec=25, tm_wday=6, tm_yday=235, tm_isdst=0)
4、time.mktime(t):將一個struct_time轉化為時間戳
time.mktime() 函數執行與gmtime(), localtime()相反的操作,它接收struct_time對象作為參數,返回用秒數表示時間的浮點數。
如果輸入的值不是一個合法的時間,將觸發 OverflowError 或 ValueError。
參數:
- t – 結構化的時間或者完整的9位元組元素
>>> time.mktime(time.localtime())
1440338541.0
5、time.sleep(secs):線程推遲指定的時間運行
線程睡眠指定時間,單位為妙。
睡眠10秒
>>> time.sleep(10)
6、time.clock()
這個函數,
函數以浮點數計算的秒數返回當前的CPU時間。用來衡量不同程序的耗時,比time.time()更有用。在不同的系統上含義不同。在NUix系統上,它返回的是“進程時間”,它是用妙表示的浮點數(時間戳)。而在Windows中,第一次調用,返回的是進程運行時實際時間。而第二次之後的調用是自第一次調用以後到現在的運行時間。
返回值
該函數有兩個功能:
- (1)在第一次調用的時候,返回的是程序運行的實際時間;
- (2)第二次之後的調用,返回的是自第一次調用後,到這次調用的時間間隔在win32系統下,這個函數返回的是真實時間(wall time),而在Unix/Linux下返回的是CPU時間。
實例:
#!/usr/bin/python #coding=utf-8 import time def procedure() : time.sleep(3) time1 = time.clock() procedure() print time.clock() - time1, "seconds process time!" time2 = time.time() procedure() print time.time() - time2, "seconds wall time!"
執行結果:
2.99947838799 seconds process time!
3.0 seconds wall time!
7、time.asctime( [t] )
把一個表示時間的元組或者struct_time表示為 ‘Sun Aug 23 14:31:59 2015’ 這種形式。如果沒有給參數,會將time.localtime()作為參數傳入。
參數:
- t – 9個元素的元組或者通過函數 gmtime() 或 localtime() 返回的時間值
>>> time.asctime(time.gmtime()) ‘Sun Aug 23 14:31:59 2015‘
8、time.ctime([secs])
把一個時間戳(按秒計算的浮點數)轉化為time.asctime()的形式。如果為指定參數,將會默認使用time.time()作為參數。它的作用相當於time.asctime(time.localtime(secs))
參數:
- sec – 要轉換為字符串時間的秒數
>>> time.ctime(1440338541.0) ‘Sun Aug 23 22:02:21 2015‘ >>> time.ctime() ‘Sun Aug 23 22:44:14 2015‘
9、time.strftime( format [, t] )
返回字符串表示的當地時間。
把一個代表時間的元組或者struct_time(如由time.localtime()和time.gmtime()返回)轉化為格式化的時間字符串,格式由參數format決定。如果未指定,將傳入time.localtime()。如果元組中任何一個元素越界,就會拋出ValueError的異常。函數返回的是一個可讀表示的本地時間的字符串。
參數:
- format:格式化字符串
- t :可選的參數是一個struct_time對象
時間字符串支持的格式符號:(區分大小寫)
%a 本地星期名稱的簡寫(如星期四為Thu)
%A 本地星期名稱的全稱(如星期四為Thursday)
%b 本地月份名稱的簡寫(如八月份為agu)
%B 本地月份名稱的全稱(如八月份為august)
%c 本地相應的日期和時間的字符串表示(如:15/08/27 10:20:06)
%d 一個月中的第幾天(01 - 31)
%f 微妙(範圍0.999999)
%H 一天中的第幾個小時(24小時制,00 - 23)
%I 第幾個小時(12小時制,0 - 11)
%j 一年中的第幾天(001 - 366)
%m 月份(01 - 12)
%M 分鐘數(00 - 59)
%p 本地am或者pm的相應符
%S 秒(00 - 61)
%U 一年中的星期數。(00 - 53星期天是一個星期的開始。)第一個星期天之 前的所有天數都放在第0周。
%w 一個星期中的第幾天(0 - 6,0是星期天)
%W 和%U基本相同,不同的是%W以星期一為一個星期的開始。
%x 本地相應日期字符串(如15/08/01)
%X 本地相應時間字符串(如08:08:10)
%y 去掉世紀的年份(00 - 99)兩個數字表示的年份
%Y 完整的年份(4個數字表示年份)
%z 與UTC時間的間隔(如果是本地時間,返回空字符串)
%Z 時區的名字(如果是本地時間,返回空字符串)
%% ‘%’字符
實例:
>>> formattime
time.struct_time(tm_year=2015, tm_mon=8, tm_mday=24, tm_hour=13, tm_min=1, tm_sec=30, tm_wday=0, tm_yday=236, tm_isdst=-1)
通過函數將struct_time轉成格式字符串
>>> time.strftime("%Y-%m-%d %H:%M:%S", formattime) ‘2015-08-24 13:01:30‘
也可以直接使用字符串拼接成格式時間字符串
>>> print str(formattime.tm_year) + "年" + str(formattime.tm_mon) + "月" + str(formattime.tm_mday) + "日"
2015年8月24日
將當前時間的時間戳轉換成想要的時間格式字符串
>>> print time.strftime("%Y/%m/%d %H:%M:%S", time.localtime())
2015/08/28 12:25:25
獲取當前時間的時分秒
>>> print time.strftime(‘%H:%M:%S‘)
18:46:42
獲取當前時間的年月日
>>> print time.strftime(‘%y-%m-%d‘)
15-08-27
格式符號實例:
>>> t = datetime.datetime.now()
>>> t
datetime.datetime(2015, 8, 27, 18, 46, 42, 605000)
獲取當前時間的格式化時間
>>> print t.strftime(‘%Y-%m-%d %H:%M:%S %f‘)
2015-08-27 18:46:42 605000
>>> print t.strftime(‘%y-%m-%d %I:%M:%S %p‘)
15-08-27 06:46:42 PM
星期的簡寫
>>> print t.strftime(‘%a‘)
Th
星期的全寫
>>> print t.strftime(‘%A‘)
Thursday
月份的簡寫
>>> print t.strftime(‘%b‘)
Aug
月份的全寫
>>> print t.strftime(‘%B‘)
August
得到日期時間的字符串
>>> print t.strftime(‘%c‘)
08/27/15 18:46:42
日期字符串
>>> print t.strftime(‘%x‘)
08/27/15
時間字符串
>>> print t.strftime(‘%X‘)
18:46:42
今天在這周是星期幾
>>> print t.strftime(‘%w‘)
4
今天是今年的第幾天
>>> print t.strftime(‘%j‘)
239
這周是今年的第幾周
>>> print t.strftime(‘%U‘)
34
10、time.strptime(string[,format])
將格式字符串轉化成struct_time.
該函數是time.strftime()函數的逆操作。time strptime() 函數根據指定的格式把一個時間字符串解析為時間元組。所以函數返回的是struct_time對象。
參數:
- string :時間字符串
- format:格式化字符串
創建一個時間字符串變量stime
>>> stime = "2015-08-24 13:01:30"
通過strptime()函數將stime轉化成strcut_time形式
>>> formattime = time.strptime(stime,"%Y-%m-%d %H:%M:%S")
>>> print formattime
time.struct_time(tm_year=2015, tm_mon=8, tm_mday=24, tm_hour=13, tm_min=1, tm_sec=30, tm_wday=0, tm_yday=236, tm_isdst=-1)
遍歷返回的時間元組序列
>>> for i in formattime :
... print i,
...
2015 8 24 13 1 30 0 236 -1
註意在使用strptime()函數將一個指定格式的時間字符串轉化成元組時,參數format的格式必須和string的格式保持一致,如果string中日期間使用“-”分隔,format中也必須使用“-”分隔,時間中使用冒號“:”分隔,後面也必須使用冒號分隔,否則會報格式不匹配的錯誤。
Python時間模塊之Time模塊解析