time是python自帶的模塊,用於處理時間問題,提供了一系列的操作時間的函數。 以下說明針對於 python2.7,其他版本可能有所差異。 模塊提供了兩個種表示時間的格式: 1.時間戳,是以秒錶示從“新紀元”到現在的時間,稱為 UTC 或者 GMT。這個“新紀元”指的就是1970年1月1日。所以 ...
time是python自帶的模塊,用於處理時間問題,提供了一系列的操作時間的函數。
以下說明針對於 python2.7,其他版本可能有所差異。
模塊提供了兩個種表示時間的格式:
1.時間戳,是以秒表示從“新紀元”到現在的時間,稱為 UTC 或者 GMT。這個“新紀元”指的就是1970年1月1日。所以時間戳指的就是從“新紀元”到某一個時間一共過去了多少秒,可能是一個整數,也可能是一個浮點數。至於為什麼會這樣,有興趣的可以讀下這篇文章:戳這裡
2.一個包括 9 個元素的元祖,這 9 個元素分別為:
year:4位數,表示年,例如:2016
month:表示月份,範圍是 1-12
day:表示天,範圍是 1-31
hours:小時,範圍是 0-23
minute:分鐘,範圍是 0-59
seconds:秒,範圍是 0-59
weekday:星期,範圍是 0-6,星期一是0,以此類推
Julian day:是一年中的第幾天,範圍是 1-366
DST:一個標誌,決定是否使用夏令時(關於夏令時:戳這裡),為 0 時表示不使用,為 1 時表示使用,為 -1 時,mktime() 方法會根據 date 和 time 來推測。一般情況下用不著。
FUNCTIONS
1. asctime([tuple]) -> string
將元祖格式的時間轉換成字元串格式。
例如: time.asctime((2016,5,11,12,30,50,5,163,0))
如果 tuple 沒有給,將調用 localtime() 方法,獲取現在的時間。
2. clock() -> floating point number
這個有點特殊,會因系統的不同而不同,在 win 平臺中,第一次調用,返回的是進程運行的實際時間。而第二次之後的調用時是第一次調用以後到這次調用時間。(實際上是以WIN32上QueryPerformanceCounter()為基礎,它比毫秒錶示更為精確)
代碼示例:
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()
輸出:
所謂的進程運行的時間,我覺得更像運行第一次調用的這段代碼所需的時間,因為不管在第一次調用前用 sleep 停頓又或是進行一其他操作,其輸出變化也不大。
import time if __name__ == '__main__': b = [] for x in range(1000): b.append(x) time.sleep(1) print "clock1:%s" % time.clock() time.sleep(1) print "clock2:%s" % time.clock() time.sleep(1) print "clock3:%s" % time.clock()
我也不知道是不是我理解錯誤還是其他,現在先這樣理解著,有問題我以後再改正。
而在 Unix 系統中(雖然 win 也是由 unix 發展而來的),它返回的是“進程時間”,它是用秒錶示的浮點數(時間戳)。
同樣的代碼,在CentOS6.7中運行:
其輸出為:
下麵是一段實驗代碼:
import time,urllib if __name__ == '__main__': print 'start at:',time.ctime() try: ur_open = urllib.urlopen('http://www.facebook.com') except: print 'error',time.ctime() time.sleep(1) print "clock1:%s" % time.clock() try: ur_open = urllib.urlopen('http://www.facebook.com') except: print 'error',time.ctime() time.sleep(1) print "clock2:%s" % time.clock() try: ur_open = urllib.urlopen('http://www.facebook.com') except: print 'error',time.ctime() time.sleep(1) print "clock3:%s" % time.clock()
我試圖多次打開一個“不存在”的網站,看看所謂的“進程時間”是什麼:
可以看到我時間花費了1分多種,但是進程時間到最後卻只有 0.03 秒,參照這篇文章(戳這裡),我覺得應該是進程占用 cpu 的時間,因為打開遠程網頁屬於遠程 I/O 操作,並不需要大量的 cpu 計算,所以進程時間就很短了。當然這是我的推測,暫時沒有找到相應的文章說明,就先這樣理解著吧,以後有錯再改。
3. ctime(seconds) -> string
將一個時間戳(預設為當前時間)轉換成一個時間字元串。相當於 asctime(localtime(seconds)) 。
4. gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst)
將一個時間戳格式的轉換為UTC時區(0時區,中國為 UTC+8)的元祖格式。如果沒有給參數,則預設為本地時間。
然而我實際的時間是14點,14 = 6 + 8。所以要註意下時區。
5. localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min, tm_sec,tm_wday,tm_yday,tm_isdst)
將一個時間戳轉換為當前時區的元祖格式。如果沒有給參數,則預設為本地時間。
6. mktime(tuple) -> floating point number
將一個元祖格式的時間轉換為時間戳格式。
7. sleep(seconds)
線程將推遲指定的時間後運行,單位為秒。其精度為亞秒級。
關於精度級別:
分鐘級:以分鐘為單位,即速度按分鐘計算,7200轉/分
秒級:以秒為單位,即速度按秒計算,1GHz/秒
亞秒級:沒有達到秒的速度,即1GHz/1.2秒
8. time() -> floating point number
返回當前時間的時間戳。
如果系統的時鐘支持,可能會出現分數的形式。
9. strftime(format[, tuple]) -> string
把一個代表時間的元組轉換為指定格式的字元串,如果沒有傳入 tuple ,將調用 localtime() 。如果元組中任何一個元素越界(不在範圍內),將拋出 ValueError 錯誤。
關於format的表格:
格式 | 含義 | 備註 |
%a | 本地(locale)簡化星期名稱 | |
%A | 本地完整星期名稱 | |
%b | 本地簡化月份名稱 | |
%B | 本地完整月份名稱 | |
%c | 本地相應的日期和時間表示 | |
%d | 一個月中的第幾天(01 - 31) | |
%H | 一天中的第幾個小時(24小時制,00 - 23) | |
%I | 第幾個小時(12小時制,01 - 12) | |
%j | 一年中的第幾天(001 - 366) | |
%m | 月份(01 - 12) | |
%M | 分鐘數(00 - 59) | |
%p | 本地am或者pm的相應符 | 1 |
%S | 秒(01 - 61) | 2 |
%U | 一年中的星期數。(00 - 53星期天是一個星期的開始。)第一個星期天之前的所有天數都放在第0周。 | 3 |
%w | 一個星期中的第幾天(0 - 6,0是星期天) | 3 |
%W | 和%U基本相同,不同的是%W以星期一為一個星期的開始。 | |
%x | 本地相應日期 | |
%X | 本地相應時間 | |
%y | 去掉世紀的年份(00 - 99) | |
%Y | 完整的年份 | |
%Z | 時區的名字(如果不存在為空字元) | |
%% | ‘%’字元 |
備註:
1.“%p”只有與“%I”配合使用才有效果。
2.文檔中強調確實是0 - 61,而不是59,閏年秒占兩秒。
3.當使用strptime()函數時,只有當在這年中的周數和天數被確定的時候%U和%W才會被計算。
參考資料:戳這裡
例子:
10. strptime(string, format) -> struct_time
將字元串格式的時間轉換成元祖格式的。是上面方法的逆向。
總結: