1. 程式人生 > >Python 時間庫 之 標準模組time

Python 時間庫 之 標準模組time

在學習Python的時間庫時,應最先學習Python標準庫中的模組:Time、Calendar、datetime、pytz、dateutil。打好基礎後,再學習第三方庫。本篇為Python時間庫中的第一篇。

其他模組見:

一 time 模組

下面按照,從基礎概念到常用函式的順序介紹time模組

1 時間戳:格林威治時間1970年01月01日00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數。

Python中獲取時間的常用方法是,先得到時間戳,再將其轉換成想要的時間格式

2 元組struct_time:日期、時間是包含許多變數的,所以在Python中定義了一個元組struct_time將所有這些變數組合在一起,包括:4位數年、月、日、小時、分鐘、秒等。

所有變數及要求如下:

序號 欄位
0 4位數年 2008
1 1 到 12
2 1到31
3 小時 0到23
4 分鐘 0到59
5 0到61 (60或61 是閏秒)
6 一週的第幾日 0到6 (0是週一)
7 一年的第幾日 1到366 (儒略曆)
8 夏令時 -1, 0, 1, -1是決定是否為夏令時的旗幟
對應的,struct_time元組的屬性如下:
序號 屬性
0 tm_year 2008
1 tm_mon 1 到 12
2 tm_mday 1 到 31
3 tm_hour 0 到 23
4 tm_min 0 到 59
5 tm_sec 0 到 61 (60或61 是閏秒)
6 tm_wday 0到6 (0是週一)
7 tm_yday 1 到 366(儒略曆)
8 tm_isdst -1, 0, 1, -1是決定是否為夏令時的旗幟

3 Time 模組的常用內建函式

下述函式,按照官方文件中的順序(按字母排序)選擇性給出,若想檢視全部函式,請轉至Python官網。 3.1 time.asctime([t]) 官方描述:

Convert a tuple or struct_time representing a time as returned by gmtime() or 

localtime() to a string of the following form: 'Sun Jun 20 23:21:051993'. If t is not provided, the current time as returned by localtime() is used. Locale information is not used by asctime().

Note

 

Unlike the C function of the same name, asctime() does not add a trailing newline.

譯文: gmtime()或localtime() 返回的 表示時間的 元組或struct_time 轉換成一個字串,格式:'Sun Jun 20 23:21:051993'。如果沒有傳入引數t,則使用localtime()返回的時間作為t。asctime()不使用時區資訊。 注意  (1)與同名的C函式不同,asctime()不會在輸出的末尾新增一個換行符。          (2)這裡的元組,指9個元素的元組,即與struct_time 相同格式的元組。


程式示例:

首先,使用函式gmtime()、localtime()的返回值作為引數。

>>> import time
>>> time.asctime(time.time()) #提供一個反例:time()函式返回時間戳,不能作為asctime()的引數,注意錯誤提示。
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    time.asctime(time.time())
TypeError: Tuple or struct_time argument required # 引數只能是元組或struct_time
>>> time.asctime(time.gmtime())
'Wed Jan 10 01:03:23 2018'
>>> time.asctime(time.localtime())
'Wed Jan 10 09:03:50 2018'
然後,自定義一個9個元素的元組作為引數。為了方便檢查,我們首先使用gmtime()返回一個正確的時間元組,然後將各屬性值拷貝到自定義元組中:
>>> time.gmtime()
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=10, tm_hour=1, tm_min=11, tm_sec=24, tm_wday=2, tm_yday=10, tm_isdst=0)
>>> tuple_time = (2018,1,10,1,11,24,2,10,0) #9個元素的元組
>>> time.asctime(tuple_time)
'Wed Jan 10 01:11:24 2018'
>>> tuple_time = (2018,10,1,1,11,24,2,10,0) #若改變元組中元素的順序,time.asctime()將不能正確表示時間。
>>> time.asctime(tuple_time)
'Wed Oct  1 01:11:24 2018'
>>> tuple_time = (2018,10,1,1,11,24,2,10) #若元組中元素個數不等於9個,將會報錯
>>> time.asctime(tuple_time)
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    time.asctime(tuple_time)
TypeError: function takes exactly 9 arguments (8 given) #這裡的引數提示有點歧義,應該是函式asctime()需要一個引數, 
#該引數中含有9個元素
>>> time.asctime(2018,10,1,1,11,24,2,10,0) #嘗試錯誤提示中的函式需要9個引數,此時又報錯。說明上面錯誤提示有歧義。Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    time.asctime(2018,10,1,1,11,24,2,10,0)
TypeError: asctime expected at most 1 arguments, got 9 3.2 time.ctime([secs]) 官方描述: time.ctime([secs])

Convert a time expressed in seconds since the epoch to a string representing local time. If secs is not provided or None, the current time as returned by time() is used. ctime(secs) is equivalent to asctime(localtime(secs)). Locale information is not used by ctime().

譯文: 把一個時間戳(用秒計算的浮點數)轉換為一個表示本地時間的字串。如果引數secs未給出或為None,就使用由time()返回的當前時間。ctime(secs)的作用與asctime(localtime(secs))相同,只是使用方法不同而已。ctime()不使用時區資訊。 注意 (1)ctime()、localtime()的時間戳都是使用time()獲取的。    (2)ctime()、localtime()呼叫的時候都可以不傳入引數,此時兩者都是預設呼叫time()函式。 ctime()與asctime()的比較程式:
>>> import time
>>> asctime = time.asctime(time.localtime()) 
>>> ctime = time.ctime(time.time())
>>> asctime
'Wed Jan 10 09:43:42 2018' 
>>> ctime
'Wed Jan 10 09:44:51 2018'
>>> type(asctime) #說明ctime()與asctime() 輸出的內容完全相同(值相同、型別相同)。
<class 'str'>
>>> type(ctime)
<class 'str'>
ctime()與asctime()的異同點 異:兩者引數不同。ctime([secs])的引數是時間戳(常用time.time()獲得),而asctime([t])的引數是時間元組(常用localtime()或gmtime())。 同:兩者輸出時間的格式相同。
3.3 time.gmtime() 
官方描述:
time.gmtime([secs])

Convert a time expressed in seconds since the epoch to a struct_time in UTC in which the dst flag is always zero. If secs is not provided or None, the current time as returned by time() is used. Fractions of a second are ignored. See above for a description of the struct_time object. Seecalendar.timegm() for the inverse of this function.

譯文: 將一個時間戳(以秒錶示的時間)轉換為UTC中的struct_time,其中dst標誌始終為零。如果未提供secsNone,則使用由time()返回的當前時間。忽略秒的分數。
注: DST:Daylight Saving Time,表面意思——陽光節約時,常用說法——夏令時。 有的地方也稱其“節能時”,為什麼這麼稱呼呢?因為人們利用夏季天亮的早這一自然現象,認為地將時間提前一小時。這樣就可以使人們早起早睡,以充分利用光照資源,減少照明時間,從而節約照明用電。 關於gmtime()使用的使用,將與接下來要說的localtime()對比來講。

3.4 time.localtime([secs])

官方描述:
time.localtime([secs])

Like gmtime() but converts to local time. If secs is not provided or None, the current time as returned by time() is used. The dst flag is set to 1 when DST applies to the given time.

譯文:
time.localtime([secs])

但結果是轉換為本地時間。如果未提供secsNone,則使用由time()返回的當前時間。若給定時間使用的是夏令時,就將dst標誌設定為1。

gmtime()與localtime()的異同點同: (1) 兩者的引數相同,都是時間戳。若沒有提供引數,都會自動呼叫time .time()得到時間戳。  (2) 兩者返回的結果格式相同,都是'SunJun2023:21:051993' 異: 兩者返回的時間是兩個時區對相同時刻的時間表示。其中,gmtime()表示的是0時區的標準時間,而localtime()表示的是本地時區的時間。 程式舉例:
>>> import time
>>> [time.gmtime(),time.localtime()] #只有tm_hour相差8個小時,其他都相同。(筆者本地採用東八區時間,相差8個時區。)
[time.struct_time(tm_year=2018, tm_mon=1, tm_mday=10, tm_hour=7, tm_min=49, tm_sec=55, tm_wday=2, tm_yday=10, tm_isdst=0), time.struct_time(tm_year=2018, tm_mon=1, tm_mday=10, tm_hour=15, tm_min=49, tm_sec=55, tm_wday=2, tm_yday=10, tm_isdst=0)]
>>> [time.asctime(time.gmtime()),time.asctime(time.localtime())] #兩個時間相差8個小時。
['Wed Jan 10 07:53:35 2018', 'Wed Jan 10 15:53:35 2018']
而我們平時採用的一般是函式time.localtime()。

3.5 time.strftime(format[t])

官方描述:
譯文:

如果未提供t,則使用localtime()返回的當前時間。引數format[,t]必須是字串。如果t中的任何欄位超出允許範圍,則會引發ValueError(原文為:ValueError is raised if any field in t is outside of the allowed range.

0,在時間元組中的任何位置,都是合法引數;如果通常是非法的,則該值被強制為正確的值。( if it is normally illegal the value is forced to a correct one.

以下指令可以嵌入format字串中。它們沒有可選的欄位寬度和精度規範,並由strftime()結果中指示的字元替換:

Python中時間日期格式化符號:

指示 含義 筆記
%a Locale的縮寫工作日名稱。
%A Locale的整個工作日名稱。
%b 語言環境的縮寫月份名稱。
%B Locale的完整月份名稱。
%c 語言環境的適當日期和時間表示。
%d 一個十進位制數字[01,31]。
%H 小時(24小時制),十進位制數[00,23]。
%I 小時(12小時制)十進位制數[01,12]。
%j 一年中的十進位制數[001,366]。
%m 月為十進位制數[01,12]。
%M 以十進位制數分鐘[00,59]。
%p Locale相當於AM或PM。 (1)
%S 秒為十進位制數[00,61]。 (2)
%U 年的星期數(星期日為星期的第一天)為十進位制數[00,53]。在第一個星期日之前的新的一年的所有天被認為是在第0周。 (3)
%w 工作日為十進位制數[0(星期日),6]。
%W 年的星期數(星期一作為星期的第一天)作為十進位制數[00,53]。在第一個星期一之前的新的一年中的所有天被認為是在第0周。 (3)
%x 語言環境的適當日期表示。
%X 語言環境的適當時間表示。
%y 年,無世紀作為十進位制數[00,99]。
%Y 年份以世紀為十進位制數。
%z 指示與+ HHMM或-HHMM形式的UTC / GMT的正或負時差的時區偏移,其中H表示十進位制小時數字,M表示十進位制分數字[-23:59,+23:59]。
%Z 時區名稱(如果沒有時區,則不包含字元)。
%% 字面值'%'字元。

筆記:

  1. 使用函式strptime() 時,如果指令%I用於hour, 指令%p僅影響輸出的hour,
  2. 範圍真的是061;值60在表示閏秒的時間戳中有效,且歷史原因支援值61
  3. 當與strptime()函式一起使用時,%U%W僅在計算中使用星期和年份指定。

以下是一個示例,它是與 RFC 2822 Internet電子郵件標準中指定的日期相容的日期格式。[1]

>>>
>>> from time import gmtime, strftime
>>> strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
'Thu, 28 Jun 2001 14:17:15 +0000'

在某些平臺上可能支援附加指令,但只有在此列出的指令具有由ANSI C標準化的含義。要檢視平臺上支援的所有格式程式碼集,請參閱strftime(3)文件。

在某些平臺上,可選欄位寬度和精度規範可以緊跟在以下順序的指令的初始'%'之後:這也不便攜。除了%j,欄位寬度通常為2,其中它為3。

雖然關於函式time.strftime()的介紹非常複雜,但使用起來很簡單。
>>> import time
>>> time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) #顯示時區的時間
'2018-01-10 13:10:28'
>>> time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) #顯示本地時間
'2018-01-10 21:09:45'
>>> time.strftime("%Y-%m-%d %H:%M:%S") #預設呼叫time.localtime()獲取本地時間
'2018-01-10 21:11:19'
在各種場合中,自己調整字串的格式即可。但一定要符合時間日期的格式化符號。 3.6 time.strptime(string [,format] ) 官方描述:
譯文: time.strptime(string[format])

按照格式format,解析表示時間的字串string。

引數format使用的指令與函式strftime()所使用的相同;預設使用"%a%b%d%H:%M:%S%Y",與ctime()返回的格式匹配。如果string不能按照format解析,或者在解析後有多餘的資料存在,則會引發ValueError。

The format parameter uses the same directives as those used by strftime(); it defaults to "%a %b %d %H:%M:%S %Y" which matches the formatting returned by ctime()如果string不能根據格式解析,或者如果解析後有過多的資料,則會引發ValueErrorThe default values used to fill in any missing data when more accurate values cannot be inferred are (1900, 1, 1, 0, 0, 0, 0, 1, -1). 如果缺失了某些資料或難以推斷出更加精準的資料,預設值(1900,1,1,0,0,0,0,1,-1)會被填充進去。stringformat必須是字串。

例如:

>>>
>>> import time
>>> time.strptime("30 Nov 00", "%d %b %y")