在C语言中,计算星期几通常基于Zeller公式或基姆拉尔森公式(Kim Larsen formula),以下是两种实现方法:

(图片来源网络,侵删)
方法1:Zeller公式(适用于格里高利历)
#include <stdio.h>
// Zeller公式计算星期几(0=星期六, 1=星期日, ..., 6=星期五)
int zeller(int year, int month, int day) {
if (month < 3) {
month += 12;
year--;
}
int k = year % 100;
int j = year / 100;
int h = (day + (13 * (month + 1)) / 5 + k + k / 4 + j / 4 + 5 * j) % 7;
return (h + 5) % 7; // 调整为0=星期日, 1=星期一, ..., 6=星期六
}
const char* weekday(int dayOfWeek) {
static const char* weekdays[] = {
"星期日", "星期一", "星期二", "星期三",
"星期四", "星期五", "星期六"
};
return weekdays[dayOfWeek];
}
int main() {
int year, month, day;
printf("输入年 月 日(如2025 10 15): ");
scanf("%d %d %d", &year, &month, &day);
int dayOfWeek = zeller(year, month, day);
printf("%d年%d月%d日是%s\n", year, month, day, weekday(dayOfWeek));
return 0;
}
说明:
- Zeller公式调整了月份(1月和2月视为前一年的13月和14月)。
- 返回值
0表示星期六,1表示星期日,依此类推,通过(h + 5) % 7调整为0=星期日。
方法2:基姆拉尔森公式(更简洁)
#include <stdio.h>
// 基姆拉尔森公式(0=星期日, 1=星期一, ..., 6=星期六)
int kim_larsen(int year, int month, int day) {
if (month < 3) {
month += 12;
year--;
}
int h = (day + (13 * (month + 1)) / 5 + year + year / 4 - year / 100 + year / 400) % 7;
return h;
}
const char* weekday(int dayOfWeek) {
static const char* weekdays[] = {
"星期日", "星期一", "星期二", "星期三",
"星期四", "星期五", "星期六"
};
return weekdays[dayOfWeek];
}
int main() {
int year, month, day;
printf("输入年 月 日(如2025 10 15): ");
scanf("%d %d %d", &year, &month, &day);
int dayOfWeek = kim_larsen(year, month, day);
printf("%d年%d月%d日是%s\n", year, month, day, weekday(dayOfWeek));
return 0;
}
说明:
- 基姆拉尔森公式直接返回
0=星期日,无需额外调整。 - 公式中的
- year / 100 + year / 400处理了世纪年的闰年规则。
输出示例:
输入:2025 10 15
输出:2025年10月15日是星期日
注意事项:
- 日期范围:两种公式均适用于格里高利历(1582年10月15日之后)。
- 输入验证:实际使用时应检查日期的有效性(如2月30日无效)。
- 星期名称:可根据需求修改
weekday()函数中的字符串数组。
如果需要处理更复杂的日期逻辑(如闰年验证、历史日期),建议使用标准库 <time.h> 的 mktime() 和 localtime() 函数。

(图片来源网络,侵删)
