calendar
— 常用日历相关函数¶
源代码: Lib/calendar.py
此模块允许您输出类似于 Unix cal 程序的日历,并提供与日历相关的其他有用函数。默认情况下,这些日历以星期一作为一周的第一天,星期日作为最后一天(欧洲惯例)。使用 setfirstweekday()
将一周的第一天设置为星期日 (6) 或任何其他工作日。指定日期的参数以整数形式给出。有关相关功能,另请参阅 datetime
和 time
模块。
此模块中定义的函数和类使用理想化的日历,即当前的格里高利历在两个方向上无限扩展。这与 Dershowitz 和 Reingold 的著作“Calendrical Calculations”中“先发格里高利历”的定义相符,它是所有计算的基础日历。0 年和负年份的解释按照 ISO 8601 标准的规定。0 年是公元前 1 年,-1 年是公元前 2 年,以此类推。
- class calendar.Calendar(firstweekday=0)¶
创建一个
Calendar
对象。 firstweekday 是一个整数,指定一周的第一天。MONDAY
是0
(默认值),SUNDAY
是6
。Calendar
对象提供了几个可用于准备日历数据以进行格式化的方法。此类本身不进行任何格式化。这是子类的工作。Calendar
实例具有以下方法- iterweekdays()¶
返回一个迭代器,用于迭代一周中将使用的星期几数字。迭代器中的第一个值将与
firstweekday
属性的值相同。
- itermonthdates(year, month)¶
返回一年 year 中 month 月 (1–12) 的迭代器。此迭代器将返回该月的所有日期(作为
datetime.date
对象),以及该月开始之前或结束后为获得完整一周所需的所有日期。
- itermonthdays(year, month)¶
返回一年 year 中 month 月的迭代器,类似于
itermonthdates()
,但不限于datetime.date
范围。返回的日期将只是月份中的日期数字。对于指定月份之外的日期,日期数字为0
。
- itermonthdays2(year, month)¶
返回一年 year 中 month 月的迭代器,类似于
itermonthdates()
,但不限于datetime.date
范围。返回的日期将是由月份中的日期数字和星期几数字组成的元组。
- itermonthdays3(year, month)¶
返回一年 year 中 month 月的迭代器,类似于
itermonthdates()
,但不限于datetime.date
范围。返回的日期将是由年、月和月份中的日期数字组成的元组。3.7 版新增。
- itermonthdays4(year, month)¶
返回一年 year 中 month 月的迭代器,类似于
itermonthdates()
,但不限于datetime.date
范围。返回的日期将是由年、月、月份中的日期和星期几数字组成的元组。3.7 版新增。
- monthdatescalendar(year, month)¶
返回 _year_ 年 _month_ 月中完整周的列表。周是包含七个
datetime.date
对象的列表。
- monthdays2calendar(year, month)¶
返回 _year_ 年 _month_ 月中完整周的列表。周是包含七个日期编号和星期几编号元组的列表。
- monthdayscalendar(year, month)¶
返回 _year_ 年 _month_ 月中完整周的列表。周是包含七个日期编号的列表。
- yeardatescalendar(year, width=3)¶
返回指定年份的数据,以便进行格式化。返回值是月份行的列表。每个月份行最多包含 _width_ 个月(默认为 3)。每个月包含 4 到 6 周,每周包含 1-7 天。天是
datetime.date
对象。
- yeardays2calendar(year, width=3)¶
返回指定年份的数据,以便进行格式化(类似于
yeardatescalendar()
)。周列表中的条目是日期编号和星期几编号的元组。本月之外的日期编号为零。
- yeardayscalendar(year, width=3)¶
返回指定年份的数据,以便进行格式化(类似于
yeardatescalendar()
)。周列表中的条目是日期编号。本月之外的日期编号为零。
- class calendar.TextCalendar(firstweekday=0)¶
此类可用于生成纯文本日历。
TextCalendar
实例具有以下方法- formatmonth(theyear, themonth, w=0, l=0)¶
以多行字符串形式返回一个月的日历。如果提供了 _w_,则它指定日期列的宽度,这些列居中对齐。如果给定了 _l_,则它指定每周将使用的行数。取决于构造函数中指定的或由
setfirstweekday()
方法设置的第一个工作日。
- prmonth(theyear, themonth, w=0, l=0)¶
打印
formatmonth()
返回的一个月的日历。
- formatyear(theyear, w=2, l=1, c=6, m=3)¶
以多行字符串形式返回整年的 _m_ 列日历。可选参数 _w_、_l_ 和 _c_ 分别用于日期列宽度、每周行数和月份列之间的空格数。取决于构造函数中指定的或由
setfirstweekday()
方法设置的第一个工作日。可以为其生成日历的最早年份取决于平台。
- pryear(theyear, w=2, l=1, c=6, m=3)¶
打印
formatyear()
返回的整年日历。
- class calendar.HTMLCalendar(firstweekday=0)¶
此类可用于生成 HTML 日历。
HTMLCalendar
实例具有以下方法- formatmonth(theyear, themonth, withyear=True)¶
以 HTML 表格形式返回一个月的日历。如果 _withyear_ 为 true,则年份将包含在标题中,否则将仅使用月份名称。
- formatyear(theyear, width=3)¶
以 HTML 表格形式返回一年的日历。_width_(默认为 3)指定每行显示的月数。
- formatyearpage(theyear, width=3, css='calendar.css', encoding=None)¶
以完整的 HTML 页面的形式返回一年的日历。width(默认为 3)指定每行显示的月数。css 是要使用的层叠样式表的名称。如果不需要使用样式表,则可以传递
None
。encoding 指定用于输出的编码(默认为系统默认编码)。
- formatmonthname(theyear, themonth, withyear=True)¶
以 HTML 表格行的形式返回月份名称。如果 withyear 为 true,则年份将包含在行中,否则仅使用月份名称。
HTMLCalendar
具有以下属性,您可以覆盖这些属性以自定义日历使用的 CSS 类- cssclasses¶
用于每个工作日的 CSS 类列表。默认类列表为
cssclasses = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
可以为每天添加更多样式
cssclasses = ["mon text-bold", "tue", "wed", "thu", "fri", "sat", "sun red"]
请注意,此列表的长度必须为七个项目。
- cssclass_noday¶
上个月或下个月出现的星期几的 CSS 类。
3.7 版新增。
- cssclasses_weekday_head¶
用于标题行中工作日名称的 CSS 类列表。默认值与
cssclasses
相同。3.7 版新增。
- cssclass_month_head¶
月份标题 CSS 类(由
formatmonthname()
使用)。默认值为"month"
。3.7 版新增。
- cssclass_month¶
整个月表格的 CSS 类(由
formatmonth()
使用)。默认值为"month"
。3.7 版新增。
- cssclass_year¶
整年表格的 CSS 类(由
formatyear()
使用)。默认值为"year"
。3.7 版新增。
- cssclass_year_head¶
整年表格标题的 CSS 类(由
formatyear()
使用)。默认值为"year"
。3.7 版新增。
请注意,尽管上述类属性的命名是单数形式(例如
cssclass_month
cssclass_noday
),但可以用空格分隔的 CSS 类列表替换单个 CSS 类,例如"text-bold text-red"
以下是如何自定义
HTMLCalendar
的示例class CustomHTMLCal(calendar.HTMLCalendar): cssclasses = [style + " text-nowrap" for style in calendar.HTMLCalendar.cssclasses] cssclass_month_head = "text-center month-head" cssclass_month = "text-center month" cssclass_year = "text-italic lead"
- class calendar.LocaleTextCalendar(firstweekday=0, locale=None)¶
可以在构造函数中将语言环境名称传递给
TextCalendar
的此子类,它将以指定的语言环境返回月份和工作日名称。
- class calendar.LocaleHTMLCalendar(firstweekday=0, locale=None)¶
可以在构造函数中将语言环境名称传递给
HTMLCalendar
的此子类,它将以指定的语言环境返回月份和工作日名称。
注意
这两个类的构造函数、formatweekday()
和 formatmonthname()
方法会将 LC_TIME
语言环境临时更改为给定的 locale。因为当前语言环境是进程范围的设置,所以它们不是线程安全的。
对于简单的文本日历,此模块提供以下函数。
- calendar.setfirstweekday(weekday)¶
设置每周开始的工作日(
0
为星期一,6
为星期日)。为了方便起见,提供了值MONDAY
、TUESDAY
、WEDNESDAY
、THURSDAY
、FRIDAY
、SATURDAY
和SUNDAY
。例如,要将第一个工作日设置为星期日import calendar calendar.setfirstweekday(calendar.SUNDAY)
- calendar.firstweekday()¶
返回每周开始的工作日的当前设置。
- calendar.leapdays(y1, y2)¶
返回从 y1 到 y2(不包括 y2)范围内的闰年数,其中 y1 和 y2 是年份。
此函数适用于跨越世纪变化的范围。
- calendar.weekday(year, month, day)¶
返回 year(
1970
–…)、month(1
–12
)、day(1
–31
)是星期几(0
为星期一)。
- calendar.weekheader(n)¶
返回包含缩写星期几名称的标题。n 指定一个星期几的字符宽度。
- calendar.monthrange(year, month)¶
返回指定 year 和 month 的月份中第一天的星期几和天数。
- calendar.monthcalendar(year, month)¶
返回表示一个月日历的矩阵。 每行代表一周; 月份之外的天数用零表示。 除非由
setfirstweekday()
设置,否则每周从星期一开始。
- calendar.month(theyear, themonth, w=0, l=0)¶
使用
TextCalendar
类的formatmonth()
,以多行字符串形式返回一个月的日历。
- calendar.prcal(year, w=0, l=0, c=6, m=3)¶
打印
calendar()
返回的整年日历。
- calendar.calendar(year, w=2, l=1, c=6, m=3)¶
使用
TextCalendar
类的formatyear()
,以多行字符串形式返回整年的 3 列表格。
- calendar.timegm(tuple)¶
一个不相关但很方便的函数,它接受一个时间元组,例如
time
模块中的gmtime()
函数返回的时间元组,并返回相应的 Unix 时间戳值,假设纪元为 1970 年,并使用 POSIX 编码。 实际上,time.gmtime()
和timegm()
互为反函数。
calendar
模块导出以下数据属性
- calendar.day_name¶
表示当前语言环境中星期几的数组。
- calendar.day_abbr¶
表示当前语言环境中星期几缩写的数组。
- calendar.MONDAY¶
- calendar.TUESDAY¶
- calendar.WEDNESDAY¶
- calendar.THURSDAY¶
- calendar.FRIDAY¶
- calendar.SATURDAY¶
- calendar.SUNDAY¶
星期几的别名,其中
MONDAY
为0
,SUNDAY
为6
。3.12 版新增。
- calendar.month_name¶
表示当前语言环境中一年中月份的数组。 这遵循一月为 1 月的正常惯例,因此它的长度为 13,并且
month_name[0]
是空字符串。
- calendar.month_abbr¶
一个数组,表示当前语言环境中一年中月份的缩写。它遵循一月为 1 月的正常约定,因此它的长度为 13,并且
month_abbr[0]
是空字符串。
- calendar.JANUARY¶
- calendar.FEBRUARY¶
- calendar.MARCH¶
- calendar.APRIL¶
- calendar.MAY¶
- calendar.JUNE¶
- calendar.JULY¶
- calendar.AUGUST¶
- calendar.SEPTEMBER¶
- calendar.OCTOBER¶
- calendar.NOVEMBER¶
- calendar.DECEMBER¶
一年中月份的别名,其中
JANUARY
为1
,DECEMBER
为12
。3.12 版新增。
calendar
模块定义了以下异常
- exception calendar.IllegalMonthError(month)¶
ValueError
的子类,当给定的月份号超出 1-12(含)的范围时引发。- month¶
无效的月份号。
- exception calendar.IllegalWeekdayError(weekday)¶
ValueError
的子类,当给定的星期几号超出 0-6(含)的范围时引发。- weekday¶
无效的星期几号。
命令行用法¶
2.5 版新增。
calendar
模块可以作为脚本从命令行执行以交互式打印日历。
python -m calendar [-h] [-L LOCALE] [-e ENCODING] [-t {text,html}]
[-w WIDTH] [-l LINES] [-s SPACING] [-m MONTHS] [-c CSS]
[year] [month]
例如,要打印 2000 年的日历
$ python -m calendar 2000
2000
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 1 2 3 4 5 6 1 2 3 4 5
3 4 5 6 7 8 9 7 8 9 10 11 12 13 6 7 8 9 10 11 12
10 11 12 13 14 15 16 14 15 16 17 18 19 20 13 14 15 16 17 18 19
17 18 19 20 21 22 23 21 22 23 24 25 26 27 20 21 22 23 24 25 26
24 25 26 27 28 29 30 28 29 27 28 29 30 31
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 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 11
10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18
17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25
24 25 26 27 28 29 30 29 30 31 26 27 28 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 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 10
10 11 12 13 14 15 16 14 15 16 17 18 19 20 11 12 13 14 15 16 17
17 18 19 20 21 22 23 21 22 23 24 25 26 27 18 19 20 21 22 23 24
24 25 26 27 28 29 30 28 29 30 31 25 26 27 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 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 17
16 17 18 19 20 21 22 20 21 22 23 24 25 26 18 19 20 21 22 23 24
23 24 25 26 27 28 29 27 28 29 30 25 26 27 28 29 30 31
30 31
接受以下选项
- --help, -h¶
显示帮助信息并退出。
- --locale LOCALE, -L LOCALE¶
用于月份和星期几名称的语言环境。默认为英语。
- --encoding ENCODING, -e ENCODING¶
用于输出的编码。如果设置了
--locale
,则需要--encoding
。
- --type {text,html}, -t {text,html}¶
将日历作为文本或 HTML 文档打印到终端。
- year¶
要打印日历的年份。必须是 1 到 9999 之间的数字。默认为当前年份。
文本模式选项
- --width WIDTH, -w WIDTH¶
日期列在终端列中的宽度。日期打印在列的中央。任何小于 2 的值都将被忽略。默认为 2。
- --lines LINES, -l LINES¶
终端行中每周的行数。日期打印在顶部对齐。任何小于 1 的值都将被忽略。默认为 1。
- --spacing SPACING, -s SPACING¶
列中月份之间的空格数。任何小于 2 的值都将被忽略。默认为 6。
- --months MONTHS, -m MONTHS¶
每行打印的月数。默认为 3。
HTML 模式选项
- --css CSS, -c CSS¶
用于日历的 CSS 样式表的路径。这必须是相对于生成的 HTML 的路径,或者是绝对 HTTP 或
file:///
URL。