人人都会AI编程

14.3 calendar 模块:日历处理

更新时间:2026-07-12

calendar 模块提供了一系列与日历相关的函数,让你可以用程序生成日历文本、判断闰年、计算某个月的天数等。它常被用在生成报表、排班系统、日期选择器的后台逻辑中。

核心功能速览

  • 判断闰年:isleap(year)
  • 获取某个月的天数:monthrange(year, month) 返回 (第一天星期几, 天数)
  • 生成完整日历文本:calendar.calendar(year)calendar.month(year, month)
  • 自定义日历输出:TextCalendarHTMLCalendar

常用方法详解

检查闰年

import calendar

print(calendar.isleap(2024))  # True,2024 是闰年
print(calendar.isleap(2023))  # False

获取月份信息

# monthrange 返回 (该月第一天是星期几, 该月天数)
first_weekday, days = calendar.monthrange(2025, 2)
print(first_weekday)  # 5,即星期六(0=星期一,6=星期日)
print(days)           # 28

monthrange 在需要计算某个月每一天具体日期时非常有用,比如生成排班表或计算工作日。

打印日历文本

# 打印 2025 年 1 月的日历
print(calendar.month(2025, 1))

输出:

    January 2025
Mo Tu We Th Fr Sa Su
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

设置星期起始日
默认以星期一为第一天,可以通过 calendar.setfirstweekday(calendar.SUNDAY) 改为星期日。也可以直接在生成日历的函数里指定。

calendar.setfirstweekday(calendar.SUNDAY)
print(calendar.month(2025, 1))

输出里星期日会出现在最左列。

生成整年日历

print(calendar.calendar(2025))

会打印出 2025 年 12 个月的完整日历文本。

实际案例:生成一个月所有星期一的日期

import calendar

year, month = 2025, 3
first_day, last_date = calendar.monthrange(year, month)
mondays = []
for day in range(1, last_date + 1):
    if calendar.weekday(year, month, day) == calendar.MONDAY:
        mondays.append(f"{year}-{month:02d}-{day:02d}")
print(mondays)
# 输出: ['2025-03-03', '2025-03-10', '2025-03-17', '2025-03-24', '2025-03-31']

更灵活的输出:TextCalendar 和 HTMLCalendar

如果需要在 Web 页面展示日历,HTMLCalendar 可以直接生成 HTML 表格。

from calendar import HTMLCalendar

cal = HTMLCalendar()
print(cal.formatmonth(2025, 1))

输出的 HTML 片段可以直接嵌入网页。

什么时候用它?

  • 需要快速生成一个控制台日历查看日期(如写个简单脚本看本月日历)
  • 计算某个月有多少天、如何排班
  • 判断闰年或计算工作日、节假日分布
  • 在 Django/Flask 等 Web 应用中生成日历界面

整体来说,calendar 模块是处理“日历”这个特定场景的利器,和 timedatetime 配合使用才能完整覆盖时间日期需求。