python standard library calendar

python 标准库 calendar

每日一词:

calendar

[ˈkælɪndə(r)] [ˈkælɪndər]

  • n. 日历;[天] 历法;日程表
  • vt. 将…列入表中;将…排入日程表

短语

chinese calendar 中国传统历法 ; 阴历 ; 中国农历

lunar calendar 阴历 ; 夏历 ; 来自日月星辰的力量 ; 太阴历

solar calendar 太阳历 ; 公历 ; 阳历与阴历

还有几天就过年了,2020年充满了期待,你呢?

今天我们学习python 标准库 calendar 。

输出像 Unix cal 那样的日历,它还提供了其它与日历相关的实用函数。 默认情况下,这些日历把星期一当作一周的第一天,星期天为一周的最后一天(按照欧洲惯例)。 可以使用 setfirstweekday() 方法设置一周的第一天为星期天 (6) 或者其它任意一天。 使用整数作为指定日期的参数。 更多相关的函数,参见 datetimetime 模块。

在这个模块中定义的函数和类都基于一个理想化的日历,现行公历向过去和未来两个方向无限扩展。这与 Dershowitz 和 Reingold 的书 “历法计算” 中所有计算的基本日历 – “proleptic Gregorian” 日历的定义相符合。 ISO 8601标准还规定了 0 和 负数年份。0年指公元前1年, -1年指公元前2年,依此类推 .

源代码

源代码: Lib/calendar.py

主要类和方法,节选自源码

1
2
3
4
5
6
__all__ = ["IllegalMonthError", "IllegalWeekdayError", "setfirstweekday",
"firstweekday", "isleap", "leapdays", "weekday", "monthrange",
"monthcalendar", "prmonth", "month", "prcal", "calendar",
"timegm", "month_name", "month_abbr", "day_name", "day_abbr",
"Calendar", "TextCalendar", "HTMLCalendar", "LocaleTextCalendar",
"LocaleHTMLCalendar", "weekheader"]

class calendar.Calendar(firstweekday=0)

创建一个 Calendar 对象。 firstweekday 是一个整数,用于指定一周的第一天。 0 是星期一(默认值),6 是星期天。

Calendar 对象提供了一些可被用于准备日历数据格式化的方法。 这个类本身不执行任何格式化操作。 这部分任务应由子类来完成。

Calendar 类的实例有下列方法:

  • iterweekdays()

    返回一个迭代器,迭代器的内容为一星期的数字。迭代器的第一个值与 firstweekday 属性的值一至。

  • itermonthdates(year, month)

    返回一个迭代器,迭代器的内容为 yearmonth 月(1-12)的日期。这个迭代器返回当月的所有日期 ( datetime.date 对象),日期包含了本月头尾用于组成完整一周的日期。

  • itermonthdays(year, month)

    返回一个迭代器,迭代器的内容与 itermonthdates() 类似,为 yearmonth 月的日期,但不受 datetime.date 范围限制。返回的日期为当月每一天的日期对应的天数。对于不在当月的日期,显示为 0

  • itermonthdays2(year, month)

    返回一个迭代器,迭代器的内容与 itermonthdates() 类似为 yearmonth 月的日期,但不受 datetime.date 范围的限制。迭代器中的元素为一个由日期和代表星期几的数字组成的的元组。

  • itermonthdays3(year, month)

    返回一个迭代器,迭代器的内容与 itermonthdates() 类似为 yearmonth 月的日期,但不受 datetime.date 范围的限制。迭代器的元素为一个由年,月,日组成的元组。3.7 新版功能.

  • itermonthdays4(year, month)

    返回一个迭代器,迭代器的内容与 itermonthdates() 类似为 yearmonth 月的日期,但不受 datetime.date 范围的限制。迭代器的元素为一个由年,月,日和代表星期几的数字组成的元组。3.7 新版功能.

  • monthdatescalendar(year, month)

    返回一个表示指定年月的周列表。周列表由七个 datetime.date 对象组成。

  • monthdays2calendar(year, month)

    返回一个表示指定年月的周列表。周列表由七个代表日期的数字和代表周几的数字组成的二元元组。

  • monthdayscalendar(year, month)

    返回一个表示指定年月的周列表。周列表由七个代表日期的数字组成。

  • yeardatescalendar(year, width=3)

    返回可以用来格式化的指定年月的数据。返回的值是一个列表,列表是月份组成的行。每一行包含了最多 width 个月(默认为3)。每个月包含了4到6周,每周包含1–7天。每一天使用 datetime.date 对象。

  • yeardays2calendar(year, width=3)

    返回可以用来模式化的指定年月的数据(与 yeardatescalendar() 类似)。周列表的元素是由表示日期的数字和表示星期几的数字组成的元组。不在这个月的日子为0。

  • yeardayscalendar(year, width=3)

    返回可以用来模式化的指定年月的数据(与 yeardatescalendar() 类似)。周列表的元素是表示日期的数字。不在这个月的日子为0。

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 为真,则年份将会包含在表头,否则只显示月份。formatyear(theyear, width=3)返回一个 HTML 表格作为指定年份的日历。 width (默认为3) 用于规定每一行显示月份的数量。formatyearpage(theyear, width=3, css=’calendar.css’, encoding=None)返回一个完整的 HTML 页面作为指定年份的日历。 width\(默认为3) 用于规定每一行显示的月份数量。 *css 为层叠样式表的名字。如果不使用任何层叠样式表,可以使用 Noneencoding* 为输出页面的编码 (默认为系统的默认编码)。HTMLCalendar 有以下属性,你可以重载它们来自定义应用日历的样式。

  • cssclasses一个对应星期一到星期天的 CSS class 列表。默认列表为
1
cssclasses = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]

可以向每天加入其它样式

1
cssclasses = ["mon text-bold", "tue", "wed", "thu", "fri", "sat", "sun red"]

需要注意的是,列表的长度必须为7。

  • cssclass_noday

    工作日的 CSS 类在上个月或下个月发生。

  • 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), 但我们可以使用空格将样式类列表中的多个元素分隔开,例如:

1
"text-bold text-red"

下面是一个如何自定义 HTMLCalendar 的示例

1
2
3
4
5
6
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 可以在构造函数中传递一个语言环境名称,并且返回月份和星期几的名称在特定语言环境中。如果此语言环境包含编码,则包含月份和工作日名称的所有字符串将作为 unicode 返回。

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

  • calendar.setfirstweekday(weekday)

    设置每一周的开始(0 表示星期一,6 表示星期天)。calendar还提供了 MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAYSUNDAY 几个常量方便使用。例如,设置每周的第一天为星期天

    1
    2
    import calendar
    calendar.setfirstweekday(calendar.SUNDAY)
  • calendar.firstweekday()

    返回当前设置的每星期的第一天的数值。

  • calendar.isleap(year)

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

  • calendar.leapdays(y1, y2)

    返回在范围 y1y2 (包含 y1 和 y2 )之间的闰年的年数,其中 y1y2 是年份。此函数适用于跨越一个世纪变化的范围。

  • calendar.weekday(year, month, day)

    返回某年( 1970 – …),某月( 112 ),某日( 131 )是星期几( 0 是星期一)。

  • calendar.weekheader(n)

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

  • calendar.monthrange(year, month)

    返回指定 年份 的指定 月份 的第一天是星期几和这个月的天数。

  • 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.day_name

    在当前语言环境下表示星期几的数组。

  • calendar.day_abbr

    在当前语言环境下表示星期几缩写的数组。

  • calendar.month_name

    在当前语言环境下表示一年中月份的数组。这遵循一月的月号为 1 的通常惯例,所以它的长度为 13 且 month_name[0] 是空字符串。

  • calendar.month_abbr

    在当前语言环境下表示月份简写的数组。这遵循一月的月号为 1 的通常惯例,所以它的长度为 13 且 month_abbr[0] 是空字符串。

例子

小结

默认情况下,这些日历将星期一作为一周的第一天,将星期日作为一周的最后一天(欧洲惯例)。不过,我们可以使用setfirstweekday()方法来设置一周的第一天为星期日或h者其他工作日,指定的日期以整数形式给出。

坚持原创技术分享,您的支持将鼓励我继续创作!