標(biāo)準庫(5)

2018-02-24 15:48 更新

“一寸光陰一寸金,寸金難買寸光陰”,時間是寶貴的。

在日常生活中,“時間”這個屬于是比較籠統(tǒng)和含糊的。在物理學(xué)中,“時間”是一個非常明確的概念。在python中,“時間”可以通過相關(guān)模塊實現(xiàn)。

calendar

>>> 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()去查看這個模塊下的所有內(nèi)容。為了讓讀者閱讀方便,將常用的整理如下:

calendar(year,w=2,l=1,c=6)

返回year年年歷,3個月一行,間隔距離為c。 每日寬度間隔為w字符。每行長度為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

怎么判斷一年是閏年,常常見諸于一些編程語言的練習(xí)題,現(xiàn)在用一個方法搞定。

leapdays(y1,y2)

返回在Y1,Y2兩年之間的閏年總數(shù),包括y1,但不包括y2,這有點如同序列的切片一樣。

>>> calendar.leapdays(2000,2004)
1
>>> calendar.leapdays(2000,2003)
1

month(year,month,w=2,l=1)

返回year年month月日歷,兩行標(biāo)題,一周一行。每日寬度間隔為w字符。每行的長度為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)

返回一個列表,列表內(nè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]]

讀者可以將這個結(jié)果和calendar.month(2015, 5)去對照理解。

monthrange(year,month)

返回一個元組,里面有兩個整數(shù)。第一個整數(shù)代表著該月的第一天從星期幾是(從0開始,依次為星期一、星期二,直到6代表星期日)。第二個整數(shù)是該月一共多少天。

>>> calendar.monthrange(2015, 5)
(4, 31)

從返回值可知,2015年5月1日是星期五,這個月一共31天。這個結(jié)果,也可以從日歷中看到。

weekday(year,month,day)

輸入年月日,知道該日是星期幾(注意,返回值依然按照從0到6依次對應(yīng)星期一到星期六)。

>>> calendar.weekday(2015, 5, 4)    #星期一
0
>>> calendar.weekday(2015, 6, 4)    #星期四
3

time

time()

time模塊是常用的。

>>> import time
>>> time.time()
1430745298.391026

time.time()獲得的是當(dāng)前時間(嚴格說是時間戳),只不過這個時間對人不友好,它是以1970年1月1日0時0分0秒為計時起點,到當(dāng)前的時間長度(不考慮閏秒)

UNIX時間,或稱POSIX時間是UNIX或類UNIX系統(tǒng)使用的時間表示方式:從協(xié)調(diào)世界時1970年1月1日0時0分0秒起至現(xiàn)在的總秒數(shù),不考慮閏秒

現(xiàn)時大部分使用UNIX的系統(tǒng)都是32位元的,即它們會以32位二進制數(shù)字表示時間。但是它們最多只能表示至協(xié)調(diào)世界時間2038年1月19日3時14分07秒(二進制:01111111 11111111 11111111 11111111,0x7FFF:FFFF),在下一秒二進制數(shù)字會是10000000 00000000 00000000 00000000,(0x8000:0000),這是負數(shù),因此各系統(tǒng)會把時間誤解作1901年12月13日20時45分52秒(亦有說回歸到1970年)。這時可能會令軟體發(fā)生問題,導(dǎo)致系統(tǒng)癱瘓。

目前的解決方案是把系統(tǒng)由32位元轉(zhuǎn)為64位元系統(tǒng)。在64位系統(tǒng)下,此時間最多可以表示到292,277,026,596年12月4日15時30分08秒。

有沒有對人友好一點的時間顯示呢?

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)

這個就友好多了。得到的結(jié)果可以稱之為時間元組(也有括號),其各項的含義是:

索引 屬性 含義
0 tm_year
1 tm_mon
2 tm_mday
3 tm_hour
4 tm_min
5 tm_sec
6 tm_wday 一周中的第幾天
7 tm_yday 一年中的第幾天
8 tm_isdst 夏令時
>>> t = time.localtime()
>>> t[1]
5

通過索引,能夠得到相應(yīng)的屬性,上面的例子中就得到了當(dāng)前時間的月份。

其實,time.localtime()不是沒有參數(shù),它在默認情況下,以time.time()的時間戳為參數(shù)。言外之意就是說可以自己輸入一個時間戳,返回那個時間戳所對應(yīng)的時間(按照公元和時分秒計時)。例如:

>>> 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()得到的是本地時間,如果要國際化,就最好使用格林威治時間??梢赃@樣:

>>> 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)準時間(中國大陸翻譯:格林尼治平均時間或格林尼治標(biāo)準時間,臺、港、澳翻譯:格林威治標(biāo)準時間;英語:Greenwich Mean Time,GMT)是指位於英國倫敦郊區(qū)的皇家格林威治天文臺的標(biāo)準時間,因為本初子午線被定義在通過那裡的經(jīng)線。

還有更友好的:

asctime()

>>> time.asctime()
'Mon May  4 21:46:13 2015'

time.asctime()的參數(shù)為空時,默認是以time.localtime()的值為參數(shù),所以得到的是當(dāng)前日期時間和星期。當(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ù)必須是時間元組,類似上面那種。不是時間戳,通過time.time()得到的時間戳,也可以轉(zhuǎn)化為上面形式:

ctime()

>>> time.ctime()
'Mon May  4 21:52:22 2015'

在沒有參數(shù)的時候,事實上是以time.time()的時間戳為參數(shù)。也可以自定義一個時間戳。

>>> time.ctime(1000000)
'Mon Jan 12 21:46:40 1970'

跟前面得到的結(jié)果是一樣的。只不過是用了時間戳作為參數(shù)。

在前述函數(shù)中,通過localtime()、gmtime()得到的是時間元組,通過time()得到的是時間戳。有的函數(shù)如asctime()是以時間元組為參數(shù),有的如ctime()是以時間戳為函數(shù)。這樣做的目的是為了滿足編程中多樣化的需要。

mktime()

mktime()也是以時間元組為參數(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

返回了時間戳。就類似于localtime()的逆過程(localtime()是以時間戳為參數(shù))。

以上基本能夠滿足編程需要了嗎?好像還缺點什么,因為在編程中,用的比較多的是“字符串”,似乎還沒有將時間轉(zhuǎn)化為字符串的函數(shù)。這個應(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.

將時間元組按照指定格式要求轉(zhuǎn)化為字符串。如果不指定時間元組,就默認為localtime()值。我說復(fù)雜,是在于其format,需要用到下面的東西。

格式 含義 取值范圍(格式)
%y 去掉世紀的年份 00-99,如"15"
%Y 完整的年份 如"2015"
%j 指定日期是一年中的第幾天 001-366
%m 返回月份 01-12
%b 本地簡化月份的名稱 簡寫英文月份
%B 本地完整月份的名稱 完整英文月份
%d 該月的第幾日 如5月1日返回"01"
%H 該日的第幾時(24小時制) 00-23
%l 該日的第幾時(12小時制) 01-12
%M 分鐘 00-59
%S 00-59
%U 在該年中的第多少星期(以周日為一周起點) 00-53
%W 同上,只不過是以周一為起點 00-53
%w 一星期中的第幾天 0-6
%Z 時區(qū) 在中國大陸測試,返回CST,即China Standard Time
%x 日期 日/月/年
%X 時間 時:分:秒
%c 詳細日期時間 日/月/年 時:分:秒
%% ‘%’字符 ‘%’字符
%p 上下午 AM or PM

簡要列舉如下:

>>> 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ù)要指定兩個,一個是時間字符串,另外一個是時間字符串所對應(yīng)的格式,格式符號用上表中的。例如:

>>> 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)

datetime

雖然time模塊已經(jīng)能夠把有關(guān)時間方面的東西搞定了,但是,在某些調(diào)用的時候,還感覺不是很直接,于是又出來了一個datetime模塊,供程序猿和程序媛們選擇使用。

datetime模塊中有幾個類:

  • datetime.date:日期類,常用的屬性有year/month/day
  • datetime.time:時間類,常用的有hour/minute/second/microsecond
  • datetime.datetime:日期時間類
  • datetime.timedelta:時間間隔,即兩個時間點之間的時間長度
  • datetime.tzinfo:時區(qū)類

date類

通過實例了解常用的屬性:

>>> import datetime
>>> today = datetime.date.today()
>>> today
datetime.date(2015, 5, 5)

這里其實生成了一個日期對象,然后操作這個對象的各種屬性。用print語句,可以是視覺更佳:

>>> 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(),是會報錯的,因為year不是一個方法,必須這樣行:

>>> print today.year
2015
>>> print today.month
5
>>> print today.day
5

進一步看看時間戳與格式化時間格式的轉(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類

也要生成time對象

>>> 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

timedelta類

主要用來做時間的運算。比如:

>>> now = datetime.datetime.now()
>>> print now
2015-05-05 09:22:43.142520

沒有講述datetime類,因為在有了date和time類知識之后,這個類比較簡單,我最喜歡這個now方法了。

對now增加5個小時

>>> 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

計算時間差:

>>> d = c - b
>>> print d
13 days, 19:00:00
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號