1. 程式人生 > >Python時間模塊之Time模塊解析

Python時間模塊之Time模塊解析

可選 去掉 說明 協調 all strong haml repr ecs

在我們平常的代碼中,經常需要和時間打交道。在Python中,與時間處理相關的模塊有:time、datetime以及calendar。學會計算時間,對程序的調優非常重要,可以在程序中狂打時間戳,來具體判斷程序中哪一塊耗時最多,從而找到程序調優的重心處。這裏先來講一個time模塊。
在開始前,先說明幾點:

  1. 在Python中,通常有這幾種方式表示時間:時間戳、格式化的時間字符串、元組(struct_time 共九種元素)。由於Python的time模塊主要是調用C庫實現的,所以在不同的平臺可能會有所不同。
  2. 時間戳(timestamp)的方式:時間戳表示是從1970年1月1號 00:00:00開始到現在按秒計算的偏移量。查看一下type(time.time())的返回值類型,可以看出是float類型。返回時間戳的函數主要有time()、clock()等。
  3. UTC(世界協調時),就是格林威治天文時間,也是世界標準時間。在中國為UTC+8。DST夏令時。
  4. 元組方式: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模塊解析