“一寸光陰一寸金,寸金難買(mǎi)寸光陰”,時(shí)間是寶貴的。
在日常生活中,“時(shí)間”這個(gè)屬于是比較籠統(tǒng)和含糊的。在物理學(xué)中,“時(shí)間”是一個(gè)非常明確的概念。在python中,“時(shí)間”可以通過(guò)相關(guān)模塊實(shí)現(xiàn)。
>>> import calendar
>>> cal = calendar.month(2015, 1)
>>> print cal
January 2015
Mo Tu We Th Fr Sa Su
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
輕而易舉得到了2015年1月的日歷,并且排列的還那么整齊。這就是calendar模塊。讀者可以用dir()去查看這個(gè)模塊下的所有內(nèi)容。為了讓讀者閱讀方便,將常用的整理如下:
calendar(year,w=2,l=1,c=6)
返回year年年歷,3個(gè)月一行,間隔距離為c。 每日寬度間隔為w字符。每行長(zhǎng)度為21 W+18+2 C。l是每星期行數(shù)。
>>> year = calendar.calendar(2015)
>>> print year
2015
January February March
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 1 1
5 6 7 8 9 10 11 2 3 4 5 6 7 8 2 3 4 5 6 7 8
12 13 14 15 16 17 18 9 10 11 12 13 14 15 9 10 11 12 13 14 15
19 20 21 22 23 24 25 16 17 18 19 20 21 22 16 17 18 19 20 21 22
26 27 28 29 30 31 23 24 25 26 27 28 23 24 25 26 27 28 29
30 31
April May June
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 1 2 3 1 2 3 4 5 6 7
6 7 8 9 10 11 12 4 5 6 7 8 9 10 8 9 10 11 12 13 14
13 14 15 16 17 18 19 11 12 13 14 15 16 17 15 16 17 18 19 20 21
20 21 22 23 24 25 26 18 19 20 21 22 23 24 22 23 24 25 26 27 28
27 28 29 30 25 26 27 28 29 30 31 29 30
July August September
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 1 2 1 2 3 4 5 6
6 7 8 9 10 11 12 3 4 5 6 7 8 9 7 8 9 10 11 12 13
13 14 15 16 17 18 19 10 11 12 13 14 15 16 14 15 16 17 18 19 20
20 21 22 23 24 25 26 17 18 19 20 21 22 23 21 22 23 24 25 26 27
27 28 29 30 31 24 25 26 27 28 29 30 28 29 30
31
October November December
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 1 1 2 3 4 5 6
5 6 7 8 9 10 11 2 3 4 5 6 7 8 7 8 9 10 11 12 13
12 13 14 15 16 17 18 9 10 11 12 13 14 15 14 15 16 17 18 19 20
19 20 21 22 23 24 25 16 17 18 19 20 21 22 21 22 23 24 25 26 27
26 27 28 29 30 31 23 24 25 26 27 28 29 28 29 30 31
30
isleap(year)
判斷是否為閏年,是則返回true,否則false.
>>> calendar.isleap(2000)
True
>>> calendar.isleap(2015)
False
怎么判斷一年是閏年,常常見(jiàn)諸于一些編程語(yǔ)言的練習(xí)題,現(xiàn)在用一個(gè)方法搞定。
leapdays(y1,y2)
返回在Y1,Y2兩年之間的閏年總數(shù),包括y1,但不包括y2,這有點(diǎn)如同序列的切片一樣。
>>> calendar.leapdays(2000,2004)
1
>>> calendar.leapdays(2000,2003)
1
month(year,month,w=2,l=1)
返回year年month月日歷,兩行標(biāo)題,一周一行。每日寬度間隔為w字符。每行的長(zhǎng)度為7* w+6。l是每星期的行數(shù)。
>>> print calendar.month(2015, 5)
May 2015
Mo Tu We Th Fr Sa Su
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
monthcalendar(year,month)
返回一個(gè)列表,列表內(nèi)的元素還是列表,這叫做嵌套列表。每個(gè)子列表代表一個(gè)星期,都是從星期一到星期日,如果沒(méi)有本月的日期,則為0。
>>> calendar.monthcalendar(2015, 5)
[[0, 0, 0, 0, 1, 2, 3], [4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23, 24], [25, 26, 27, 28, 29, 30, 31]]
讀者可以將這個(gè)結(jié)果和calendar.month(2015, 5)
去對(duì)照理解。
monthrange(year,month)
返回一個(gè)元組,里面有兩個(gè)整數(shù)。第一個(gè)整數(shù)代表著該月的第一天從星期幾是(從0開(kāi)始,依次為星期一、星期二,直到6代表星期日)。第二個(gè)整數(shù)是該月一共多少天。
>>> calendar.monthrange(2015, 5)
(4, 31)
從返回值可知,2015年5月1日是星期五,這個(gè)月一共31天。這個(gè)結(jié)果,也可以從日歷中看到。
weekday(year,month,day)
輸入年月日,知道該日是星期幾(注意,返回值依然按照從0到6依次對(duì)應(yīng)星期一到星期六)。
>>> calendar.weekday(2015, 5, 4) #星期一
0
>>> calendar.weekday(2015, 6, 4) #星期四
3
time()
time模塊是常用的。
>>> import time
>>> time.time()
1430745298.391026
time.time()
獲得的是當(dāng)前時(shí)間(嚴(yán)格說(shuō)是時(shí)間戳),只不過(guò)這個(gè)時(shí)間對(duì)人不友好,它是以1970年1月1日0時(shí)0分0秒為計(jì)時(shí)起點(diǎn),到當(dāng)前的時(shí)間長(zhǎng)度(不考慮閏秒)
UNIX時(shí)間,或稱(chēng)POSIX時(shí)間是UNIX或類(lèi)UNIX系統(tǒng)使用的時(shí)間表示方式:從協(xié)調(diào)世界時(shí)1970年1月1日0時(shí)0分0秒起至現(xiàn)在的總秒數(shù),不考慮閏秒
現(xiàn)時(shí)大部分使用UNIX的系統(tǒng)都是32位元的,即它們會(huì)以32位二進(jìn)制數(shù)字表示時(shí)間。但是它們最多只能表示至協(xié)調(diào)世界時(shí)間2038年1月19日3時(shí)14分07秒(二進(jìn)制:01111111 11111111 11111111 11111111,0x7FFF:FFFF),在下一秒二進(jìn)制數(shù)字會(huì)是10000000 00000000 00000000 00000000,(0x8000:0000),這是負(fù)數(shù),因此各系統(tǒng)會(huì)把時(shí)間誤解作1901年12月13日20時(shí)45分52秒(亦有說(shuō)回歸到1970年)。這時(shí)可能會(huì)令軟體發(fā)生問(wèn)題,導(dǎo)致系統(tǒng)癱瘓。
目前的解決方案是把系統(tǒng)由32位元轉(zhuǎn)為64位元系統(tǒng)。在64位系統(tǒng)下,此時(shí)間最多可以表示到292,277,026,596年12月4日15時(shí)30分08秒。
有沒(méi)有對(duì)人友好一點(diǎn)的時(shí)間顯示呢?
localtime()
>>> time.localtime()
time.struct_time(tm_year=2015, tm_mon=5, tm_mday=4, tm_hour=21, tm_min=33, tm_sec=39, tm_wday=0, tm_yday=124, tm_isdst=0)
這個(gè)就友好多了。得到的結(jié)果可以稱(chēng)之為時(shí)間元組(也有括號(hào)),其各項(xiàng)的含義是:
索引 | 屬性 | 含義 |
---|---|---|
0 | tm_year | 年 |
1 | tm_mon | 月 |
2 | tm_mday | 日 |
3 | tm_hour | 時(shí) |
4 | tm_min | 分 |
5 | tm_sec | 秒 |
6 | tm_wday | 一周中的第幾天 |
7 | tm_yday | 一年中的第幾天 |
8 | tm_isdst | 夏令時(shí) |
>>> t = time.localtime()
>>> t[1]
5
通過(guò)索引,能夠得到相應(yīng)的屬性,上面的例子中就得到了當(dāng)前時(shí)間的月份。
其實(shí),time.localtime()
不是沒(méi)有參數(shù),它在默認(rèn)情況下,以time.time()
的時(shí)間戳為參數(shù)。言外之意就是說(shuō)可以自己輸入一個(gè)時(shí)間戳,返回那個(gè)時(shí)間戳所對(duì)應(yīng)的時(shí)間(按照公元和時(shí)分秒計(jì)時(shí))。例如:
>>> time.localtime(100000)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=2, tm_hour=11, tm_min=46, tm_sec=40, tm_wday=4, tm_yday=2, tm_isdst=0)
gmtime()
localtime()得到的是本地時(shí)間,如果要國(guó)際化,就最好使用格林威治時(shí)間??梢赃@樣:
>>> import time
>>> time.gmtime()
time.struct_time(tm_year=2015, tm_mon=5, tm_mday=4, tm_hour=23, tm_min=46, tm_sec=34, tm_wday=0, tm_yday=124, tm_isdst=0)
格林威治標(biāo)準(zhǔn)時(shí)間(中國(guó)大陸翻譯:格林尼治平均時(shí)間或格林尼治標(biāo)準(zhǔn)時(shí)間,臺(tái)、港、澳翻譯:格林威治標(biāo)準(zhǔn)時(shí)間;英語(yǔ):Greenwich Mean Time,GMT)是指位於英國(guó)倫敦郊區(qū)的皇家格林威治天文臺(tái)的標(biāo)準(zhǔn)時(shí)間,因?yàn)楸境踝游缇€被定義在通過(guò)那裡的經(jīng)線。
還有更友好的:
asctime()
>>> time.asctime()
'Mon May 4 21:46:13 2015'
time.asctime()
的參數(shù)為空時(shí),默認(rèn)是以time.localtime()
的值為參數(shù),所以得到的是當(dāng)前日期時(shí)間和星期。當(dāng)然,也可以自己設(shè)置參數(shù):
>>> h = time.localtime(1000000)
>>> h
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=12, tm_hour=21, tm_min=46, tm_sec=40, tm_wday=0, tm_yday=12, tm_isdst=0)
>>> time.asctime(h)
'Mon Jan 12 21:46:40 1970'
注意,time.asctime()
的參數(shù)必須是時(shí)間元組,類(lèi)似上面那種。不是時(shí)間戳,通過(guò)time.time()
得到的時(shí)間戳,也可以轉(zhuǎn)化為上面形式:
ctime()
>>> time.ctime()
'Mon May 4 21:52:22 2015'
在沒(méi)有參數(shù)的時(shí)候,事實(shí)上是以time.time()
的時(shí)間戳為參數(shù)。也可以自定義一個(gè)時(shí)間戳。
>>> time.ctime(1000000)
'Mon Jan 12 21:46:40 1970'
跟前面得到的結(jié)果是一樣的。只不過(guò)是用了時(shí)間戳作為參數(shù)。
在前述函數(shù)中,通過(guò)localtime()、gmtime()得到的是時(shí)間元組,通過(guò)time()得到的是時(shí)間戳。有的函數(shù)如asctime()是以時(shí)間元組為參數(shù),有的如ctime()是以時(shí)間戳為函數(shù)。這樣做的目的是為了滿足編程中多樣化的需要。
mktime()
mktime()也是以時(shí)間元組為參數(shù),但是它返回的不是可讀性更好的那種樣式,而是:
>>> lt = time.localtime()
>>> lt
time.struct_time(tm_year=2015, tm_mon=5, tm_mday=5, tm_hour=7, tm_min=55, tm_sec=29, tm_wday=1, tm_yday=125, tm_isdst=0)
>>> time.mktime(lt)
1430783729.0
返回了時(shí)間戳。就類(lèi)似于localtime()的逆過(guò)程(localtime()是以時(shí)間戳為參數(shù))。
以上基本能夠滿足編程需要了嗎?好像還缺點(diǎn)什么,因?yàn)樵诰幊讨?,用的比較多的是“字符串”,似乎還沒(méi)有將時(shí)間轉(zhuǎn)化為字符串的函數(shù)。這個(gè)應(yīng)該有。
strftime()
函數(shù)格式稍微復(fù)雜一些。
Help on built-in function strftime in module time:
strftime(...) strftime(format[, tuple]) -> string
Convert a time tuple to a string according to a format specification. See the library reference manual for formatting codes. When the time tuple is not present, current time as returned by localtime() is used.
將時(shí)間元組按照指定格式要求轉(zhuǎn)化為字符串。如果不指定時(shí)間元組,就默認(rèn)為localtime()值。我說(shuō)復(fù)雜,是在于其format,需要用到下面的東西。
格式 | 含義 | 取值范圍(格式) |
---|---|---|
%y | 去掉世紀(jì)的年份 | 00-99,如"15" |
%Y | 完整的年份 | 如"2015" |
%j | 指定日期是一年中的第幾天 | 001-366 |
%m | 返回月份 | 01-12 |
%b | 本地簡(jiǎn)化月份的名稱(chēng) | 簡(jiǎn)寫(xiě)英文月份 |
%B | 本地完整月份的名稱(chēng) | 完整英文月份 |
%d | 該月的第幾日 | 如5月1日返回"01" |
%H | 該日的第幾時(shí)(24小時(shí)制) | 00-23 |
%l | 該日的第幾時(shí)(12小時(shí)制) | 01-12 |
%M | 分鐘 | 00-59 |
%S | 秒 | 00-59 |
%U | 在該年中的第多少星期(以周日為一周起點(diǎn)) | 00-53 |
%W | 同上,只不過(guò)是以周一為起點(diǎn) | 00-53 |
%w | 一星期中的第幾天 | 0-6 |
%Z | 時(shí)區(qū) | 在中國(guó)大陸測(cè)試,返回CST,即China Standard Time |
%x | 日期 | 日/月/年 |
%X | 時(shí)間 | 時(shí):分:秒 |
%c | 詳細(xì)日期時(shí)間 | 日/月/年 時(shí):分:秒 |
%% | ‘%’字符 | ‘%’字符 |
%p | 上下午 | AM or PM |
簡(jiǎn)要列舉如下:
>>> time.strftime("%y,%m,%d")
'15,05,05'
>>> time.strftime("%y/%m/%d")
'15/05/05'
分隔符可以自由指定。既然已經(jīng)變成字符串了,就可以“隨心所欲不逾矩”了。
strptime()
Help on built-in function strptime in module time:
strptime(...) strptime(string, format) -> struct_time
Parse a string to a time tuple according to a format specification. See the library reference manual for formatting codes (same as strftime()).
strptime()的作用是將字符串轉(zhuǎn)化為時(shí)間元組。請(qǐng)注意的是,其參數(shù)要指定兩個(gè),一個(gè)是時(shí)間字符串,另外一個(gè)是時(shí)間字符串所對(duì)應(yīng)的格式,格式符號(hào)用上表中的。例如:
>>> today = time.strftime("%y/%m/%d")
>>> today
'15/05/05'
>>> time.strptime(today, "%y/%m/%d")
time.struct_time(tm_year=2015, tm_mon=5, tm_mday=5, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=125, tm_isdst=-1)
雖然time模塊已經(jīng)能夠把有關(guān)時(shí)間方面的東西搞定了,但是,在某些調(diào)用的時(shí)候,還感覺(jué)不是很直接,于是又出來(lái)了一個(gè)datetime模塊,供程序猿和程序媛們選擇使用。
datetime模塊中有幾個(gè)類(lèi):
通過(guò)實(shí)例了解常用的屬性:
>>> import datetime
>>> today = datetime.date.today()
>>> today
datetime.date(2015, 5, 5)
這里其實(shí)生成了一個(gè)日期對(duì)象,然后操作這個(gè)對(duì)象的各種屬性。用print語(yǔ)句,可以是視覺(jué)更佳:
>>> print today
2015-05-05
>>> print today.ctime()
Tue May 5 00:00:00 2015
>>> print today.timetuple()
time.struct_time(tm_year=2015, tm_mon=5, tm_mday=5, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=125, tm_isdst=-1)
>>> print today.toordinal()
735723
特別注意,如果你妄圖用datetime.date.year()
,是會(huì)報(bào)錯(cuò)的,因?yàn)閥ear不是一個(gè)方法,必須這樣行:
>>> print today.year
2015
>>> print today.month
5
>>> print today.day
5
進(jìn)一步看看時(shí)間戳與格式化時(shí)間格式的轉(zhuǎn)換
>>> to = today.toordinal()
>>> to
735723
>>> print datetime.date.fromordinal(to)
2015-05-05
>>> import time
>>> t = time.time()
>>> t
1430787994.80093
>>> print datetime.date.fromtimestamp(t)
2015-05-05
還可以更靈活一些,修改日期。
>>> d1 = datetime.date(2015,5,1)
>>> print d1
2015-05-01
>>> d2 = d1.replace(year=2005, day=5)
>>> print d2
2005-05-05
也要生成time對(duì)象
>>> t = datetime.time(1,2,3)
>>> print t
01:02:03
它的常用屬性:
>>> print t.hour
1
>>> print t.minute
2
>>> print t.second
3
>>> t.microsecond
0
>>> print t.tzinfo
None
主要用來(lái)做時(shí)間的運(yùn)算。比如:
>>> now = datetime.datetime.now()
>>> print now
2015-05-05 09:22:43.142520
沒(méi)有講述datetime類(lèi),因?yàn)樵谟辛薲ate和time類(lèi)知識(shí)之后,這個(gè)類(lèi)比較簡(jiǎn)單,我最喜歡這個(gè)now方法了。
對(duì)now增加5個(gè)小時(shí)
>>> b = now + datetime.timedelta(hours=5)
>>> print b
2015-05-05 14:22:43.142520
增加兩周
>>> c = now + datetime.timedelta(weeks=2)
>>> print c
2015-05-19 09:22:43.142520
計(jì)算時(shí)間差:
>>> d = c - b
>>> print d
13 days, 19:00:00
更多建議: