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是決定是否為夏令時的旗幟 |
序號 | 屬性 | 值 |
---|---|---|
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()的返回值作為引數。
>>> 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()
.
>>> 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.
struct_time
,其中dst標誌始終為零。如果未提供secs或None
,則使用由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])
但結果是轉換為本地時間。如果未提供secs或None
,則使用由time()
返回的當前時間。若給定時間使用的是夏令時,就將dst標誌設定為1。
>>> 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 |
時區名稱(如果沒有時區,則不包含字元)。 | |
%% |
字面值'%' 字元。 |
筆記:
- 使用函式strptime() 時,如果指令%I用於hour, 指令%p僅影響輸出的hour,
- 範圍真的是
0
到61
;值60
在表示閏秒的時間戳中有效,且歷史原因支援值61
。 - 當與
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。
>>> 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不能根據格式解析,或者如果解析後有過多的資料,則會引發ValueError
。The
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)會被填充進去。string和format必須是字串。
例如:
>>> import time >>> time.strptime("30 Nov 00", "%d %b %y")