【python】詳解time模組功能asctime、localtime、mktime、sleep、strptime、strftime、time等函式以及時間的加減運算

brucewong0516發表於2018-01-12

在Python中,與時間處理相關的模組有:time、datetime以及calendar。學會計算時間,對程式的調優非常重要,可以在程式中狂打時間戳,來具體判斷程式中哪一塊耗時最多,從而找到程式調優的重心處。這裡先來講一個time模組。

time模組所包含的函式能夠實現以下功能:獲取當前的時間、操作時間和日期、從字串讀取時間及格式化時間為字串。

  • timestamp時間戳,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量;返回時間戳的函式主要有time()、clock()等
  • struct_time時間元組,共有九個元素組。gmtime(),localtime(),strptime()
  • format time 格式化時間,已格式化的結構使時間更具可讀性。包括自定義格式和固定格式。

不同格式之間的轉換如圖:
這裡寫圖片描述
其中format_string 型別的時間和struct_time之間可以轉換,timestamp時間戳可以和struct_time之間進行轉化,但是時間戳和格式化時間是不能直接轉換的。

struct_time元組結構:
這裡寫圖片描述

format time結構化表示:
這裡寫圖片描述

1、time.time()當前時間的時間戳,返回float資料,自1970年1月1日開始按照秒計算的偏移量,可以進行差值計算得到秒差

In [1]: import time
#首先定義第一個時間點的時間戳a
In [2]: a = time.time()
計算當前時間點的時間與a之間的時間間隔,以秒為單位
In [3]: b = time.time() -a
In [4]: b
Out[4]: 10.753291130065918

2、time.clock()該函式有兩個功能:

  • 在第一次呼叫的時候,返回的是程式執行的實際時間;
  • 以第二次之後的呼叫,返回的是自第一次呼叫後,到這次呼叫的時間間隔
  • 在win32系統下,這個函式返回的是真實時間(wall time),而在Unix/Linux下返回的是CPU時間。
#第一次呼叫時,返回程式實際的執行時間
In [6]: time.clock()
Out[6]: 4.266666666666667e-07
#第二次呼叫返回的是距離上一次呼叫的時間間隔
In [7]: time.clock()
Out[7]: 3.48674048
#該次呼叫返回的是距離上一次呼叫的時間間隔
In [8]: time.clock()
Out[8]: 7.2176200533333335

3、time.gmtime([secs])可以將timestamp時間戳轉化為時間元組

#如果沒有給定時間戳,直接返回當前時點的國際倫敦時間
In [5]: time.gmtime()
Out[5]: time.struct_time(tm_year=2018, tm_mon=1, tm_mday=12, tm_hour=14, tm_min=49, tm_sec=37, tm_wday=4, tm_yday=12, tm_isdst=0)
#可以將時間戳轉化為國際時間
In [9]: a = time.time()
In [10]: time.gmtime(a)
Out[10]: time.struct_time(tm_year=2018, tm_mon=1, tm_mday=12, tm_hour=15, tm_min=1, tm_sec=51, tm_wday=4, tm_yday=12, tm_isdst=0)

4、time.localtime([secs])可以將timestamp時間戳轉為時間元組

#可以將時間戳轉為本地時間
In [13]: time.localtime()
Out[13]: time.struct_time(tm_year=2018, tm_mon=1, tm_mday=12, tm_hour=23, tm_min=6, tm_sec=14, tm_wday=4, tm_yday=12, tm_isdst=0)
#如果沒有給定時間戳,直接返回當前時點的本地時間
In [12]: time.localtime(a)
Out[12]: time.struct_time(tm_year=2018, tm_mon=1, tm_mday=12, tm_hour=23, tm_min=1, tm_sec=51, tm_wday=4, tm_yday=12, tm_isdst=0)

5、time.mktime(t):將一個struct_time轉化為時間戳
time.mktime() 函式執行與gmtime(), localtime()相反的操作,它接收struct_time物件作為引數,返回用秒數表示時間的浮點數。如果輸入的值不是一個合法的時間,將觸發 OverflowError 或 ValueError。

  • 引數:t – 結構化的時間或者完整的9位元組元素
#將struct_time時間元組轉化為時間戳
In [14]: time.mktime(time.localtime())
Out[14]: 1515770088.0

6、time.sleep(secs):執行緒推遲指定的時間執行 執行緒睡眠指定時間,單位為秒。

In [15]: time.time()
    ...: for i in range(3):
    ...:     print(i)
    ...:     time.sleep(5)
    ...: time.time()
    ...:
0
1
2
Out[15]: 1515770366.3641038

7、time.asctime([t])*生成固定格式的時間表示格式,把一個表示時間的元組或者struct_time*表示為’Sat Jan 13 21:56:34 2018’這種形式。如果沒有給引數,會將time.localtime()作為引數傳入。

  • 引數:t – 9個元素的元組或者通過函式 gmtime() 或 localtime() 返回的時間值;
In [1]: import time
In [2]: time.asctime()
Out[2]: 'Sat Jan 13 21:56:34 2018'

8、time.ctime([secs]) 生成固定格式的時間表示格式,把一個時間戳(按秒計算的浮點數)轉化為time.asctime()的形式。如果為指定引數,將會預設使用time.time()作為引數。它的作用相當於time.asctime(time.localtime(secs)) 。

  • 引數:sec – 要轉換為字串時間的秒數
In [4]: time.time()
Out[4]: 1515852108.7154894

In [5]: time.ctime(time.time())
Out[5]: 'Sat Jan 13 22:01:56 2018'

In [6]: a = time.time()

In [7]: time.ctime(a)
Out[7]: 'Sat Jan 13 22:02:05 2018'

9、time.strftime( format [, t] ) 通過函式將struct_time轉成格式字串,把一個代表時間的元組或者struct_time(如由time.localtime()和time.gmtime()返回)轉化為格式化的時間字串,格式由引數format決定。如果未指定,將傳入time.localtime()。如果元組中任何一個元素越界,就會丟擲ValueError的異常。函式返回的是一個可讀表示的本地時間的字串。
引數:

  • format:格式化字串
  • t :可選的引數是一個struct_time物件

這裡寫圖片描述

#將時間元組轉化為format年月日格式
In [15]: time.strftime("%Y-%m-%d",time.gmtime())
Out[15]: '2018-01-13'
#%X返回當地時間
In [17]: time.strftime("%Y-%m-%d %X")
Out[17]: '2018-01-13 22:16:35'
#返回當地的日期和時間
In [18]: time.strftime("%x %X")
Out[18]: '01/13/18 22:17:14'
#直接使用字串拼接成格式時間字串
In [21]: tt = time.gmtime()
In [22]: str(tt.tm_year) + "年" + str(tt.tm_mon) + "月" + str(tt.tm_mday) + "日"
Out[22]: '2018年1月13日'

10、time.strptime(string,format) 將格式字串轉化成struct_time。該函式是time.strftime()函式的逆操作。time.strptime() 函式根據指定的格式把一個時間字串解析為時間元組。所以函式返回的是struct_time物件

  • 引數:string :時間字串;format:格式化字串;
#建立一個時間字串變數strtime
strtime = "2018-01-13 22:20:30"
#通過strptime()函式將strtime轉化成strcut_time形式,格式引數必須的"%Y-%m-%d %H:%M:%S",且必須strtime的時間引數一一匹配
In [27]: time.strptime(strtime,"%Y-%m-%d %H:%M:%S")
Out[27]: time.struct_time(tm_year=2018, tm_mon=1, tm_mday=13, tm_hour=22, tm_min=20, tm_sec=30, tm_wday=5, tm_yday=13, tm_isdst=-1)

11、time加減主要是通過時間戳的方式進行加減

In [28]: a = time.time()

In [29]: b = time.time()

In [30]: a+b
Out[30]: 3031709297.679469

In [31]: b-a
Out[31]: 10.370728731155396

相關文章