calendar 模块提供了一系列与日历相关的函数,让你可以用程序生成日历文本、判断闰年、计算某个月的天数等。它常被用在生成报表、排班系统、日期选择器的后台逻辑中。
核心功能速览
- 判断闰年:
isleap(year) - 获取某个月的天数:
monthrange(year, month)返回(第一天星期几, 天数) - 生成完整日历文本:
calendar.calendar(year)和calendar.month(year, month) - 自定义日历输出:
TextCalendar和HTMLCalendar类
常用方法详解
检查闰年
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 模块是处理“日历”这个特定场景的利器,和 time、datetime 配合使用才能完整覆盖时间日期需求。