杰瑞科技汇

python 日历calendar

模块简介

calendar 模块基于一个名为 gregorian 的日历系统(公历),是 Python 的标准库之一,无需额外安装,它的核心功能围绕“年”和“月”这两个概念展开。


常用函数和属性

下面我将 calendar 模块中最常用的功能分为几类进行介绍,并配有代码示例。

1 获取特定日期的信息

这类函数用于查询某个日期是星期几,或者一年有多少天等。

  • calendar.weekday(year, month, day)
    • 返回给定日期是星期几(0代表星期一,6代表星期日)。
    • 返回值是整数。
import calendar
# 查询 2025年10月1日 是星期几
# 返回 0 (周一), 1 (周二), ..., 6 (周日)
day_of_week = calendar.weekday(2025, 10, 1)
print(f"2025年10月1日是星期: {day_of_week}") # 输出: 0 (星期一)
  • calendar.monthrange(year, month)
    • 返回一个元组 (first_weekday, number_of_days)
      • first_weekday: 该月第一天是星期几(0=周一, 6=周日)。
      • number_of_days: 该月总共有多少天。
import calendar
# 查询 2025年10月 的信息
first_day, num_days = calendar.monthrange(2025, 10)
print(f"2025年10月的第一天是星期: {first_day}") # 输出: 0 (星期一)
print(f"2025年10月总共有: {num_days} 天")      # 输出: 31
  • calendar.isleap(year)
    • 判断某一年是否是闰年,如果是闰年返回 True,否则返回 False
import calendar
print(f"2025年是闰年吗? {calendar.isleap(2025)}") # 输出: True
print(f"2025年是闰年吗? {calendar.isleap(2025)}") # 输出: False
  • calendar.leapdays(year1, year2)
    • 返回在 year1year2 之间(不包括 year2)的闰年总数。
import calendar
# 计算 2000年到2025年之间有多少个闰年
num_leap_days = calendar.leapdays(2000, 2025)
print(f"2000年到2025年之间有 {num_leap_days} 个闰年") # 输出: 7 (2000, 2004, 2008, 2012, 2025, 2025)

2 生成日历文本

这是 calendar 模块最核心的功能,可以生成各种格式的日历。

  • calendar.calendar(year, w=2, l=1, c=6, m=3)
    • 生成一个指定年份的全年日历,以多行字符串形式返回。
    • w: 每个日期的字符宽度(默认2)。
    • l: 每周所占的行数(默认1)。
    • c: 月份之间的间隔字符数(默认6)。
    • m: 每行显示的月份数(默认3)。
import calendar
# 生成 2025 年的全年日历
cal_2025 = calendar.calendar(2025)
print(cal_2025)
  • calendar.month(year, month, w=2, l=1)

    生成一个指定年月的日历,以字符串形式返回。

import calendar
# 生成 2025年10月的日历
oct_2025 = calendar.month(2025, 10)
print(oct_2025)
  • calendar.monthcalendar(year, month)
    • 返回一个“月历”的列表,这是一个非常有用的函数,它返回一个列表的列表(一个二维列表)。
    • 每个子列表代表一周。
    • 如果某一天不属于当前月份,则用 0 表示。
    • 这对于数据分析或按周处理日期非常方便。
import calendar
# 获取 2025年10月的月历数据
# 第一周是 [0, 0, 1, 2, 3, 4, 5] 表示9月30日(0)和10月1-5日
month_cal = calendar.monthcalendar(2025, 10)
print("2025年10月的月历数据:")
for week in month_cal:
    print(week)

3 格式化输出 (calendar.TextCalendarcalendar.HTMLCalendar)

calendar 模块提供了两个类,可以更灵活地定制日历的格式。

  • calendar.TextCalendar(firstweekday=0)
    • 用于生成纯文本格式的日历。firstweekday 参数可以设置一周的第一天是星期几(0=周一, 6=周日)。
import calendar
# 创建一个以星期日为第一天的日历对象
# 默认 firstweekday=0 (周一)
us_cal = calendar.TextCalendar(firstweekday=6) # 6 代表星期日
# 生成 2025年10月的日历
print(us_cal.formatmonth(2025, 10))
  • calendar.HTMLCalendar(firstweekday=0)

    用于生成 HTML 格式的日历,可以直接嵌入到网页中。

import calendar
# 创建一个HTML日历对象
html_cal = calendar.HTMLCalendar(firstweekday=0) # 周一为第一天
# 生成 2025年10月的HTML日历
html_output = html_cal.formatmonth(2025, 10)
# 将HTML输出到文件或直接打印
with open("calendar.html", "w", encoding="utf-8") as f:
    f.write(html_output)
print("HTML 日历已生成到 calendar.html 文件")

综合示例:查找所有“黑色星期五”

“黑色星期五”指的是一个月的13号正好是星期五,我们可以用 calendar 模块轻松地找出某一年中所有的黑色星期五。

import calendar
def find_black_fridays(year):
    """
    查找指定年份中所有的“黑色星期五”(13号是星期五)。
    """
    black_fridays = []
    for month in range(1, 13):
        # weekday(年, 月, 13) 返回13号是星期几
        # 如果返回 4,则表示是星期五 (0=周一, 4=周五)
        if calendar.weekday(year, month, 13) == 4:
            black_fridays.append(f"{year}年{month}月13日")
    return black_fridays
# 查找 2025 年的黑色星期五
bf_2025 = find_black_fridays(2025)
print(f"2025年的黑色星期五有: {', '.join(bf_2025)}")
# 输出: 2025年的黑色星期五有: 2025年1月13日, 2025年10月13日
# 查找 2025 年的黑色星期五
bf_2025 = find_black_fridays(2025)
print(f"2025年的黑色星期五有: {', '.join(bf_2025)}")
# 输出: 2025年的黑色星期五有: 2025年9月13日

小结

功能类别 函数/方法 描述
信息查询 calendar.weekday(y, m, d) 返回星期几 (0-6)
calendar.monthrange(y, m) 返回 (第一天星期几, 该月天数)
calendar.isleap(y) 判断是否为闰年
文本生成 calendar.calendar(y) 生成全年文本日历
calendar.month(y, m) 生成单月文本日历
calendar.monthcalendar(y, m) 返回月历的二维列表
格式化类 calendar.TextCalendar 用于生成纯文本日历
calendar.HTMLCalendar 用于生成HTML日历

calendar 模块虽然功能不算极其复杂,但对于处理日常的日历任务来说已经非常足够,掌握它能让你在编写需要日期处理的脚本时事半功倍。

分享:
扫描分享到社交APP
上一篇
下一篇