calendar — 常用日历相关函数

源代码: Lib/calendar.py


此模块允许您输出类似于 Unix cal 程序的日历,并提供与日历相关的其他有用函数。默认情况下,这些日历以星期一作为一周的第一天,星期日作为最后一天(欧洲惯例)。使用 setfirstweekday() 将一周的第一天设置为星期日 (6) 或任何其他工作日。指定日期的参数以整数形式给出。有关相关功能,另请参阅 datetimetime 模块。

此模块中定义的函数和类使用理想化的日历,即当前的格里高利历在两个方向上无限扩展。这与 Dershowitz 和 Reingold 的著作“Calendrical Calculations”中“先发格里高利历”的定义相符,它是所有计算的基础日历。0 年和负年份的解释按照 ISO 8601 标准的规定。0 年是公元前 1 年,-1 年是公元前 2 年,以此类推。

class calendar.Calendar(firstweekday=0)

创建一个 Calendar 对象。 firstweekday 是一个整数,指定一周的第一天。 MONDAY0(默认值), SUNDAY6

Calendar 对象提供了几个可用于准备日历数据以进行格式化的方法。此类本身不进行任何格式化。这是子类的工作。

Calendar 实例具有以下方法

iterweekdays()

返回一个迭代器,用于迭代一周中将使用的星期几数字。迭代器中的第一个值将与 firstweekday 属性的值相同。

itermonthdates(year, month)

返回一年 yearmonth 月 (1–12) 的迭代器。此迭代器将返回该月的所有日期(作为 datetime.date 对象),以及该月开始之前或结束后为获得完整一周所需的所有日期。

itermonthdays(year, month)

返回一年 yearmonth 月的迭代器,类似于 itermonthdates(),但不限于 datetime.date 范围。返回的日期将只是月份中的日期数字。对于指定月份之外的日期,日期数字为 0

itermonthdays2(year, month)

返回一年 yearmonth 月的迭代器,类似于 itermonthdates(),但不限于 datetime.date 范围。返回的日期将是由月份中的日期数字和星期几数字组成的元组。

itermonthdays3(year, month)

返回一年 yearmonth 月的迭代器,类似于 itermonthdates(),但不限于 datetime.date 范围。返回的日期将是由年、月和月份中的日期数字组成的元组。

3.7 版新增。

itermonthdays4(year, month)

返回一年 yearmonth 月的迭代器,类似于 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 是要使用的层叠样式表的名称。如果不需要使用样式表,则可以传递 Noneencoding 指定用于输出的编码(默认为系统默认编码)。

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 为星期日)。为了方便起见,提供了值 MONDAYTUESDAYWEDNESDAYTHURSDAYFRIDAYSATURDAYSUNDAY。例如,要将第一个工作日设置为星期日

import calendar
calendar.setfirstweekday(calendar.SUNDAY)
calendar.firstweekday()

返回每周开始的工作日的当前设置。

calendar.isleap(year)

如果 year 是闰年,则返回 True,否则返回 False

calendar.leapdays(y1, y2)

返回从 y1y2(不包括 y2)范围内的闰年数,其中 y1y2 是年份。

此函数适用于跨越世纪变化的范围。

calendar.weekday(year, month, day)

返回 year1970–…)、month112)、day131)是星期几(0 为星期一)。

calendar.weekheader(n)

返回包含缩写星期几名称的标题。n 指定一个星期几的字符宽度。

calendar.monthrange(year, month)

返回指定 yearmonth 的月份中第一天的星期几和天数。

calendar.monthcalendar(year, month)

返回表示一个月日历的矩阵。 每行代表一周; 月份之外的天数用零表示。 除非由 setfirstweekday() 设置,否则每周从星期一开始。

calendar.prmonth(theyear, themonth, w=0, l=0)

打印 month() 返回的月历。

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

星期几的别名,其中 MONDAY0SUNDAY6

3.12 版新增。

class calendar.Day

枚举,将星期几定义为整数常量。 此枚举的成员作为 MONDAYSUNDAY 导出到模块作用域。

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

一年中月份的别名,其中 JANUARY1DECEMBER12

3.12 版新增。

class calendar.Month

枚举,将一年中的月份定义为整数常量。此枚举的成员作为 JANUARYDECEMBER 导出到模块作用域。

3.12 版新增。

calendar 模块定义了以下异常

exception calendar.IllegalMonthError(month)

ValueError 的子类,当给定的月份号超出 1-12(含)的范围时引发。

month

无效的月份号。

exception calendar.IllegalWeekdayError(weekday)

ValueError 的子类,当给定的星期几号超出 0-6(含)的范围时引发。

weekday

无效的星期几号。

另请参阅

模块 datetime

面向对象的日期和时间接口,功能类似于 time 模块。

模块 time

低级时间相关函数。

命令行用法

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 之间的数字。默认为当前年份。

month

要打印指定 year 的日历的月份。必须是 1 到 12 之间的数字,并且只能在文本模式下使用。默认为打印全年日历。

文本模式选项

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