使用标准库函数 localtime 和 strftime (推荐)
这是最标准、最推荐的方法,因为它直接利用了 C 标准库的功能,代码简洁、可移植性好。

(图片来源网络,侵删)
原理
- 获取当前时间的
time_t格式(从 1970 年 1 月 1 日 00:00:00 UTC 到现在的秒数)。 - 使用
localtime()函数将time_t结构转换为struct tm结构。struct tm中包含了年、月、日、时、分、秒以及星期几等信息。 - 使用
strftime()函数将struct tm中的格式化时间信息转换为你想要的字符串。%A是一个格式说明符,专门用来表示完整的星期名称(如 "Monday")。
代码示例
#include <stdio.h>
#include <time.h> // 包含所需的时间函数头文件
int main() {
// 1. 获取当前时间
time_t rawtime;
time(&rawtime); // 获取当前时间的 time_t 值
// 2. 将 time_t 转换为本地时间的 struct tm 结构
struct tm *timeinfo = localtime(&rawtime);
// 3. 使用 strftime 格式化输出星期几
char buffer[80]; // 用于存储格式化后的字符串
strftime(buffer, sizeof(buffer), "今天是 %A", timeinfo);
// 4. 打印结果
printf("%s\n", buffer);
return 0;
}
代码解析
#include <time.h>: 引入时间处理相关的头文件。time(&rawtime);: 获取当前系统时间,并将其存储在rawtime变量中。localtime(&rawtime);: 将rawtime(UTC时间)转换为本地时间,并返回一个指向struct tm结构的指针。strftime(buffer, sizeof(buffer), "今天是 %A", timeinfo);:buffer: 存放结果的字符数组。sizeof(buffer):buffer的大小,防止缓冲区溢出。"今天是 %A": 格式化字符串。%A会被替换为完整的星期名称(如 "Monday", "星期一")。timeinfo: 指向包含时间信息的struct tm结构的指针。
printf("%s\n", buffer);: 打印最终格式化的字符串。
运行结果 (取决于你系统设置的语言):
- 在中文系统上可能输出:
今天是 星期一 - 在英文系统上可能输出:
Today is Monday
手动计算星期几 (适用于特定日期)
如果你需要计算任意一个特定日期是星期几,而不是仅仅获取当前日期,那么就不能使用 localtime,这时,你需要一个经典的算法,最著名的是基姆拉尔森公式 (Kim Larsen's formula)。
原理
基姆拉尔森公式可以根据年、月、日直接计算出星期几,公式如下:
W = (d + 2m + 3(m+1)/5 + y + y/4 - y/100 + y/400) % 7
W是星期几的结果(0 代表星期日,1 代表星期一,...,6 代表星期六)。d是日。m是月。注意:如果月份是 1 月或 2 月,则需要将其当作上一年的 13 月或 14 月来处理。 2025年1月,m应为 13,y应为 2025。y是年(如果月份是 1 月或 2 月,则y是上一年)。
代码示例
#include <stdio.h>
// 计算星期几的函数
// 参数: y-年, m-月, d-日
// 返回值: 0=星期日, 1=星期一, ..., 6=星期六
int calculateWeekday(int y, int m, int d) {
// 如果月份是1月或2月,需要将其转换为上一年的13月或14月
if (m < 3) {
m += 12;
y--;
}
// 基姆拉尔森公式
int W = (d + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7;
// 调整结果,使 0 代表星期一, 1 代表星期二, ..., 6 代表星期日
// (W + 6) % 7 可以将公式原本的 0=周日 转换为 0=周一
return (W + 6) % 7;
}
int main() {
int year, month, day;
printf("请输入年 月 日 ( 2025 10 27): ");
scanf("%d %d %d", &year, &month, &day);
int weekday = calculateWeekday(year, month, day);
// 根据计算结果输出对应的星期名称
const char *weekdays[] = {
"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"
};
printf("%d年%d月%d日是 %s\n", year, month, day, weekdays[weekday]);
return 0;
}
代码解析
calculateWeekday函数实现了基姆拉尔森公式。if (m < 3)处理了 1 月和 2 月的特殊情况。const char *weekdays[]定义了一个字符串数组,将计算出的数字索引(0-6)映射到对应的中文星期名称。main函数从用户那里获取年、月、日,调用calculateWeekday函数,并打印结果。
运行示例:

(图片来源网络,侵删)
请输入年 月 日 ( 2025 10 27): 2025 5 21
2025年5月21日是 星期二
总结与对比
| 特性 | 方法一 (localtime + strftime) |
方法二 (基姆拉尔森公式) |
|---|---|---|
| 用途 | 获取当前系统时间的星期几 | 计算任意指定日期的星期几 |
| 依赖 | 依赖 C 标准库 <time.h> |
不依赖任何外部库,纯数学计算 |
| 优点 | 代码简洁、标准、可移植性好、能处理夏令时等复杂情况 | 灵活,可以计算历史或未来的任意日期 |
| 缺点 | 只能获取当前时间,无法计算过去或未来的日期 | 需要自己处理边界条件(如1月、2月),代码稍复杂 |
| 适用场景 | 日常编程中需要显示当前星期几的任务 | 日历程序、历史日期查询、生日计算等 |
推荐:
- 如果你的需求只是显示今天的星期几,请毫不犹豫地使用方法一。
- 如果你的需求是计算任何一个已知日期是星期几,请使用方法二。
