4.3 calendar:处理时间
calendar模块定义了Calendar类,其中封装了一些值的计算,如给定的一个月或一年中的周日期。另外,TextCalendar和HTMLCalendar类可以生成经过预格式化的输出。
4.3.1 格式化示例
prmonth()方法是一个简单的函数,可以生成月的格式文本输出。
import calendar
c = calendar.TextCalendar(calendar.SUNDAY)
c.prmonth(2019,2)
这个例子安装美国的惯例,将TextCalendar配置为一周从星期日开始。而默认则会使用欧洲惯例,即一周从星期一开始。这个例子会生成以下输出。
运行结果:
利用HTMLCalendar和formatmonth()可以生成一个类似的HTML表格。显示的输出看起来与纯文本的版本大致是一样的,不过会用HTML标记包围。各个表单元格有一个类属性对应星期几,从而可以通过CSS指定HTML的样式。
除了可用的默认格式外,要想以其他的某种格式生成输出,可以使用calendar计算日期,并把这些值组织为周和月区间,然后迭代处理结果。对于这个任务,Calendar的
weekheader(),monthcalendar()和yeardays2calendar()方法尤其有用。调用yeardays2calendar()会生成一个由“月行”列表构成的序列。每个月列表包含一些月,每个月是一个周列表。周是元组列表,元组则由编号(1-31)和星期几(0-6)构成。当月意外的日编号为0。
import calendar
import pprint
cal = calendar.Calendar(calendar.SUNDAY)
cal_data = cal.yeardays2calendar(2019,2)
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,width=65)
调用yeardays2calendar(2019,2)会返回2019年的数据,按每行3个月组织。
运行结果:
这等价于formatyear()使用的数据。
import calendar
cal = calendar.TextCalendar(calendar.SUNDAY)
print(cal.formatyear(2019,2,1,1,3))
如果给定相同的参数,则formatyear()会生成以下输出。
运行结果:
day_name,day_abbr,month_name和month_abbr模块属性对于生成定制格式的输出很有用(例如,在HTML输出中包含链接)。这些属性会针对当前本地化环境正确地自动配置。