讀古今文學網 > 父與子的編程之旅:與小卡特一起學Python > 24.4 時間對像 >

24.4 時間對像

Python 的日期和時間對像類在單獨的 datetime 模塊中定義。datetime 模塊包含處理日期、時間以及日期或時間之差(delta)的類。

術語箱

delta 的含義是「差」。這是一個希臘字母,看起來像是一個三角形(Δ)。

科學和數學領域經常使用希臘字母作為某些量的簡寫。delta 用於表示兩個值之差。

我們要使用的第一種對象是 datetime 對象。(沒錯,這個類與模塊同名。)datetime 對像包含年、月、日、小時、分和秒。可以像這樣創建一個 datetime 對像(在交互模式中):

下面來看會得到什麼:

>>> print when2012-10-24 10:45:56  

我們創建了一個 datetime 對象,名為 when,其中包含日期和時間值。

創建一個 datetime 對像時,參數的順序(括號中的數)應當是年、月、日、小時、分和秒。不過如果你記不住這個順序,也可以按任意順序放置參數,只是要告訴 Python 各個參數分別表示什麼,如下:

>>> when = datetime.datetime(hour=10, year=2012, minute=45, month=10,      second=56, day=24)  

還可以對 datetime 對像做一些其他處理,你可以得到單個部分,比如年、日或者分。還可以得到日期和時間的一個格式化字符串。在交互模式中試試下面的代碼:

datetime 對像分日期類和時間類。如果只關心日期,可以使用 date 類,其中只有年、月和日。如果只關心時間,可以使用 time 類,其中只包括小時、分和秒。

如下所示:

>>> today = datetime.date(2012, 10, 24)>>> some_time = datetime.time(10, 45, 56)>>> print today2012-10-24>>> print some_time10:45:56  

類似於 datetime 對象,如果指定了各個參數分別表示什麼,完全可以按不同的順序傳入參數:

>>> today = datetime.date(month=10, day=24, year=2012)>>> some_time = datetime.time(second=56, hour=10, minute=45)  

還有一種方法可以把 datetime 對像分解為 date 對像和 time 對像:

>>> today = when.date>>> some_time = when.time  

另外可以使 用 datetime 模塊中 datetime 類的 combine 方法把 datetime 對像結合起來構成 datetime 對像:

我們已經知道了什麼是 datetime 對象,也瞭解了它的一些屬性,下面來看如何比較兩個 datetime 對象,得到它們的差(兩個時間之間間隔多長)。

兩個時間之差

在仿真中,我們常常需要知道經過了多長時間。例如,在一個電子寵物程序中,可能需要知道上一次給寵物餵食之後過去了多長時間,來確定它是不是餓了。

datetime 模塊為此提供了一個對像類,可以幫助我們得出兩個日期或時間之差。這個類名為 timedelta。應該記得 delta 表示「差」。所以 timedelta 就是兩個時間之差。

要創建一個 timedelta,得到兩個時間之差,只需要將這兩個時間相減,如下:

注意,將兩個 datetime 對像相減時,我們得到的不是另一個 datetime,而是一個 timedelta 對象。Python 會自動完成這一點。

小段時間

到目前為止,我們一直都在討論按整秒度量的時間。但是時間對像(datetimedatetimetimedelta)比這更精確。它們可以精確度量到微秒級,也就是百萬分之一秒。

要瞭解這一點,可以試試 now 方法,它會給出計算機時鐘的當前時間:

>>> print datetime.datetime.now2012-10-24 21:25:44.343000  

注意這個時間不僅僅包含秒,還包括不到 1 秒的部分:

44.343000  

我的計算機上,最後 3 位總是 0,因為我的操作系統的時鐘只能精確到毫秒(千分之一秒)。不過對我來說這已經足夠精確了!

有一點很重要,儘管秒部分看起來像是浮點數,但它實際上存儲為秒數(整數)和微秒數(整數),也就是 44 秒和 343 000 微秒。要把它轉換為浮點數還需要一個小公式。假設有一個名為 some_time 的時間對象,如果希望按浮點數形式得到秒數,相應的公式如下:

seconds_float = some_time.seconds + some_time.microseconds / float(1000000)  

這裡使用 float 函數來確保不會遭遇整數相除問題。

可以使用 now 方法和一個 timedelta 對像來測試你的打字速度。代碼清單 24-2 中的程序會顯示一條隨機消息,用戶必須鍵入這條消息。程序將檢查用戶鍵入這條消息所用的時間,然後計算出打字速度。你可以試試看。

代碼清單 24-2 度量時間差——打字速度測試

關於 timedelta 對像還有一點應當知道。與 datetime 對像不同(datetime 對像包含年、月、日、小時、分和秒(以及微秒)),timedelta 對像只有日、秒和微秒。如果想得到月或年,必須根據天數計算出來。如果希望得到分或小時數,必須根據秒數來計算。