# 8.2. `calendar` - 一般日历相关功能

源代码： Lib / calendar.py

该模块允许您输出日历像 Unix cal的程序，并提供有关日历的其他有用的功能。默认情况下，这些日历会将星期一作为一周的第一天，将星期日作为最后一天（欧洲公约）。使用`setfirstweekday()`将星期几的第一天设置为星期日（6）或任何其他工作日。指定日期的参数以整数形式给出。有关相关功能，另请参阅`datetime`和`time`模块。

这些函数和类中的大多数依赖于使用理想化日历的`datetime`模块，当前公历日历在两个方向上延伸。这符合定义的"可"公历的德肖维茨和莱因戈尔德的书"历法计算"，它在哪里的基准日历的所有计算。

class `calendar.``Calendar`(firstweekday=0)

  创建`Calendar`对象。firstweekday是一个整数，指定一周的第一天。`0`是星期一（默认），`6`是星期日。

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

  `Calendar`实例具有以下方法：

  `iterweekdays`()

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

  `itermonthdates`(year, month)

    在今年年中返回迭代器，供月个月（1-12）。此迭代器将返回获取完整周所需的月份和月初之前的所有天以及月末之后的所有天（如`datetime.date`对象）。

  `itermonthdays2`(year, month)

    返回类似于`itermonthdates()`的年中的月月的迭代器。天返回将元组组成的日数和每周的天数。

  `itermonthdays`(year, month)

    返回类似于`itermonthdates()`的年中的月月的迭代器。天返回只会天的数字。

  `monthdatescalendar`(year, month)

    全周在一年的月每月返回列表的几个星期。周是七个`datetime.date`对象的列表。

  `monthdays2calendar`(year, month)

    全周在一年的月每月返回列表的几个星期。周是天数字以及平日七元组的列表。

  `monthdayscalendar`(year, month)

    全周在一年的月每月返回列表的几个星期。周有七天的数字列表。

  `yeardatescalendar`(year, width=3)

    返回为指定年份的数据准备好格式。返回值是的月行的列表。每个月行包含到宽度（默认为 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`。编码指定的编码将用于输出 （默认设置为系统默认的编码）。

class `calendar.``LocaleTextCalendar`(firstweekday=0, locale=None)

  `TextCalendar`的这个子类可以在构造函数中传递一个语言环境名称，并且将返回指定语言环境中的月和周日名称。如果此区域设置包括编码所有字符串包含月份和星期几名称将作为 unicode 返回。

class `calendar.``LocaleHTMLCalendar`(firstweekday=0, locale=None)

  `HTMLCalendar`的此子类可在构造函数中传递一个语言环境名称，并将在指定的语言环境中返回月和周日名称。如果此区域设置包括编码所有字符串包含月份和星期几名称将作为 unicode 返回。

注

这两个类的`formatweekday()`和`formatmonthname()`方法将当前语言环境临时更改为给定的语言环境。因为当前的区域设置是进程范围的设置，他们不是线程安全的。

对于简单的文本日历本模块提供了下列函数。

`calendar.``setfirstweekday`(weekday)

  设置每周开始的工作日（`0`是星期一，`6`是星期日）。`MONDAY`，`TUESDAY`，`WEDNESDAY`，`THURSDAY`，`FRIDAY`，`SATURDAY`和`SUNDAY`。例如，若要设置的第一个工作日到星期天：

      import calendar
      calendar.setfirstweekday(calendar.SUNDAY)

`calendar.``firstweekday`()

  返回为平日的当前设置，每个星期开始。

`calendar.``isleap`(year)

  如果年是闰年，则返回`True`，否则`False`。

`calendar.``leapdays`(y1, y2)

  返回闰年的数目范围内从y1到y2 （专用）， y1和y2是几年。

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

`calendar.``weekday`(year, month, day)

  返回年（`1970` -...），月的星期几（`0` （`1` - `12`），天（`1` - `31`）。

`calendar.``weekheader`(n)

  返回包含缩写的星期几名称的标头。n指定宽度 （以字符为一个工作日。

`calendar.``monthrange`(year, month)

  返回月份，为指定的年、月中的工作日的天数，每月的第一天。

`calendar.``monthcalendar`(year, month)

  返回一个矩阵，代表一个月的日历。每行代表一周；日期外的月份a由零表示。除非由`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.``month_name`

  一个数组，表示今年的几个月中的当前区域设置。这遵循正常惯例的1月是月份1，所以它的长度为13，`month_name[0]`是空字符串。

`calendar.``month_abbr`

  一个数组，表示今年的缩写个月中的当前区域设置。这遵循1月的月份1的正常惯例，因此它的长度为13，而`month_abbr[0]`是空字符串。

请参见

模块`datetime`
  面向对象的日期和时间接口，具有与`time`模块类似的功能。
模块`time`
  低级时间相关功能。