標籤:返回 索引 sep first day html表格 ade logs pytho
作用:calendar模組實現了一些類來處理日期,管理面向年、月和周的值。
Python版本:I.4版本,2.5中做了更新
calendar模組定義了 Calendar類,其中封裝了一些值的計算,如給定的一個月或一年中的 周幾。另外,TextCalendar和HTMLCalendar類可以產生經過預格式化的輸出。
模組概覽
- calendar.calendar(year,w=2,l=1,c=6)
返回一個多行字串格式的year年年曆,3個月一行,間隔距離為c。 每日寬度間隔為w字元。每行長度為21* W+18+2* C。l是每星期行數。
- calendar.firstweekday( )
返回當前每周起始日期的設定。預設情況下,首次載入caendar模組時返回0,即星期一。
- calendar.isleap(year)
是閏年返回True,否則為false。
- calendar.leapdays(y1,y2)
返回在Y1,Y2兩年之間的閏年總數。
- calendar.month(year,month,w=2,l=1)
返回一個多行字串格式的year年month月日曆,兩列名,一周一行。每日寬度間隔為w字元。每行的長度為7* w+6。l是每星期的行數。
- calendar.monthcalendar(year,month)
返回一個整數的單層嵌套列表。每個子列表裝載代表一個星期的整數。Year年month月外的日期都設為0;範圍內的日子都由該月第幾日表示,從1開始。
- calendar.monthrange(year,month)
返回兩個整數。第一個是該月的星期幾的日期碼,第二個是該月的日期碼。日從0(星期一)到6(星期日);月從1到12。
- calendar.prcal(year,w=2,l=1,c=6)
相當於 print calendar.calendar(year,w,l,c).
- calendar.prmonth(year,month,w=2,l=1)
相當於 print calendar.calendar(year,w,l,c)。
- calendar.setfirstweekday(weekday)
設定每周的起始日期碼。0(星期一)到6(星期日)。
- calendar.timegm(tupletime)
和time.gmtime相反:接受一個時間元組形式,返回該時刻的時間戳記(1970紀元後經過的浮點秒數)。
- calendar.weekday(year,month,day)
返回給定日期的日期碼。0(星期一)到6(星期日)。月份為 1(一月) 到 12(12月)。
格式化
prmonth方法是一個簡單的函數,可以產生一個月的格式化文本輸出。
import calendarcal = calendar.TextCalendar(calendar.SUNDAY)print cal.formatyear(2011, 2, 1, 1, 3)
這個例子按照美國的慣例,將TextCalendar配置為一周從星期日開始。預設會使用歐洲慣例,即一周從星期一開始。
輸出如下:
2011 January February MarchSu Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 1 2 3 4 5 1 2 3 4 5 2 3 4 5 6 7 8 6 7 8 9 10 11 12 6 7 8 9 10 11 12 9 10 11 12 13 14 15 13 14 15 16 17 18 19 13 14 15 16 17 18 1916 17 18 19 20 21 22 20 21 22 23 24 25 26 20 21 22 23 24 25 2623 24 25 26 27 28 29 27 28 27 28 29 30 3130 31 April May JuneSu Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 1 2 3 4 5 6 7 1 2 3 4 3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 1110 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 1817 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 2524 25 26 27 28 29 30 29 30 31 26 27 28 29 30 July August SeptemberSu Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 1 2 3 4 5 6 1 2 3 3 4 5 6 7 8 9 7 8 9 10 11 12 13 4 5 6 7 8 9 1010 11 12 13 14 15 16 14 15 16 17 18 19 20 11 12 13 14 15 16 1717 18 19 20 21 22 23 21 22 23 24 25 26 27 18 19 20 21 22 23 2424 25 26 27 28 29 30 28 29 30 31 25 26 27 28 29 3031 October November DecemberSu Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 1 2 3 4 5 1 2 3 2 3 4 5 6 7 8 6 7 8 9 10 11 12 4 5 6 7 8 9 10 9 10 11 12 13 14 15 13 14 15 16 17 18 19 11 12 13 14 15 16 1716 17 18 19 20 21 22 20 21 22 23 24 25 26 18 19 20 21 22 23 2423 24 25 26 27 28 29 27 28 29 30 25 26 27 28 29 30 3130 31[Finished in 0.1s]
利用HTMLCalendar和formatmonth()可以產生一個類似的HTML表格。顯示的輸出看起來與純文字的版本大致是一樣的,不過會用HTML標記包圍。各個表儲存格有一個類屬性對應星期幾,所以可以通過CSS指定HTML樣式。
要使用可用預設格式之外的某種格式產生輸出,可以使用calendar計算日期,並把這些值組織為周和月,然後迭代處理結果。對於這個任務,Calendar的weekheader()、monthcalendar() 和yeardays2calendar()方法尤其有用。
調用yeardays2calendar會產生一個由“月欄”列表構成的序列。每個列表包含一些月,每個月是一個周列表。周是元組列表,元組則由日編號(1?31)和星期幾(0~6)構成。當月以外的日編號為0。
import calendarimport pprintcal = calendar.Calendar(calendar.SUNDAY)cal_data = cal.yeardays2calendar(2011, 3)print 'len(cal_data) :', len(cal_data)top_months = cal_data[0]print 'len(top_months) :', len(top_months)first_month = top_months[0]print 'len(first_month) :', len(first_month)print 'first_month:'pprint.pprint(first_month)
調用yeardays2calendar(2011, 3)會返回20ll年的資料,按每欄3個月組織。
len(cal_data) : 4len(top_months) : 3len(first_month) : 6first_month:[[(0, 6), (0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 5)], [(2, 6), (3, 0), (4, 1), (5, 2), (6, 3), (7, 4), (8, 5)], [(9, 6), (10, 0), (11, 1), (12, 2), (13, 3), (14, 4), (15, 5)], [(16, 6), (17, 0), (18, 1), (19, 2), (20, 3), (21, 4), (22, 5)], [(23, 6), (24, 0), (25, 1), (26, 2), (27, 3), (28, 4), (29, 5)], [(30, 6), (31, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5)]][Finished in 0.1s]
這等價於formatyear使用的資料。
import calendarcal = calendar.TextCalendar(calendar.SUNDAY)print cal.formatyear(2011, 2, 1, 1, 3)
對於相同的參數,formatyear會產生以下輸出。
2011 January February MarchSu Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 1 2 3 4 5 1 2 3 4 5 2 3 4 5 6 7 8 6 7 8 9 10 11 12 6 7 8 9 10 11 12 9 10 11 12 13 14 15 13 14 15 16 17 18 19 13 14 15 16 17 18 1916 17 18 19 20 21 22 20 21 22 23 24 25 26 20 21 22 23 24 25 2623 24 25 26 27 28 29 27 28 27 28 29 30 3130 31 April May JuneSu Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 1 2 3 4 5 6 7 1 2 3 4 3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 1110 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 1817 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 2524 25 26 27 28 29 30 29 30 31 26 27 28 29 30 July August SeptemberSu Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 1 2 3 4 5 6 1 2 3 3 4 5 6 7 8 9 7 8 9 10 11 12 13 4 5 6 7 8 9 1010 11 12 13 14 15 16 14 15 16 17 18 19 20 11 12 13 14 15 16 1717 18 19 20 21 22 23 21 22 23 24 25 26 27 18 19 20 21 22 23 2424 25 26 27 28 29 30 28 29 30 31 25 26 27 28 29 3031 October November DecemberSu Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 1 2 3 4 5 1 2 3 2 3 4 5 6 7 8 6 7 8 9 10 11 12 4 5 6 7 8 9 10 9 10 11 12 13 14 15 13 14 15 16 17 18 19 11 12 13 14 15 16 1716 17 18 19 20 21 22 20 21 22 23 24 25 26 18 19 20 21 22 23 2423 24 25 26 27 28 29 27 28 29 30 25 26 27 28 29 30 3130 31[Finished in 0.1s]
day_name、day_abbr、month_name和month_abbr模組屬性對於產生定製格式的輸出很有用(例如,在HTML輸出中包含連結)。這些屬性會針對當前本地化環境正確地自動設定。
計算日期
儘管calendar模組主要強調採用不同格式列印完整的日曆,它還提供了另外一些函數,對採用其他方式處理日期很有用,如為一個重複亊件計算日期。例如,Python Atlanta Users Group 毎月的第二個星期四會召開一次會議。要計算一年中的會議日期,可以使用monthcalendar的傳回值
import calendarimport pprintpprint.pprint(calendar.monthcalendar(2011, 7))
有些日期的值為0。這說明儘管這幾天覊於另一個月,但與給定的當前月中的幾天同屬一個星期。
[[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]][Finished in 0.1s]
一周中的第一天預設為星期一。可以通過調用setfirstweekday改變這個設定,不過由於calendar模組包含一些常量來索引monthcalendar()返回的日期區間,所以在這種情況下跳過這一步會更方便。
要計算2011年的會議日期,假設是每個月的第二個星期四,0值指示第一周的星期四是否包含在這個月內(或者不包含在這個月中,比如這個月從星期五開始)。
import calendar# Show every monthfor month in range(1, 13): # Compute the dates for each week that overlaps the month c = calendar.monthcalendar(2011, month) first_week = c[0] second_week = c[1] third_week = c[2] # If there is a Thursday in the first week, the second Thursday # is in the second week. Otherwise, the second Thursday must # be in the third week. if first_week[calendar.THURSDAY]: meeting_date = second_week[calendar.THURSDAY] else: meeting_date = third_week[calendar.THURSDAY] print '%3s: %2s' % (calendar.month_abbr[month], meeting_date)
所以,這一年的會議議程為:
Jan: 13Feb: 10Mar: 10Apr: 14May: 12Jun: 9Jul: 14Aug: 11Sep: 8Oct: 13Nov: 10Dec: 8[Finished in 0.1s]
Python STL calendar