C语言如何用函数显示当前星期几?

99ANYc3cd6
预计阅读时长 12 分钟
位置: 首页 C语言 正文

使用标准库函数 localtimestrftime (推荐)

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

c语言显示星期几的函数
(图片来源网络,侵删)

原理

  1. 获取当前时间的 time_t 格式(从 1970 年 1 月 1 日 00:00:00 UTC 到现在的秒数)。
  2. 使用 localtime() 函数将 time_t 结构转换为 struct tm 结构。struct tm 中包含了年、月、日、时、分、秒以及星期几等信息。
  3. 使用 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 函数,并打印结果。

运行示例:

c语言显示星期几的函数
(图片来源网络,侵删)
请输入年 月 日 ( 2025 10 27): 2025 5 21
2025年5月21日是 星期二

总结与对比

特性 方法一 (localtime + strftime) 方法二 (基姆拉尔森公式)
用途 获取当前系统时间的星期几 计算任意指定日期的星期几
依赖 依赖 C 标准库 <time.h> 不依赖任何外部库,纯数学计算
优点 代码简洁、标准、可移植性好、能处理夏令时等复杂情况 灵活,可以计算历史或未来的任意日期
缺点 只能获取当前时间,无法计算过去或未来的日期 需要自己处理边界条件(如1月、2月),代码稍复杂
适用场景 日常编程中需要显示当前星期几的任务 日历程序、历史日期查询、生日计算等

推荐:

  • 如果你的需求只是显示今天的星期几,请毫不犹豫地使用方法一
  • 如果你的需求是计算任何一个已知日期是星期几,请使用方法二
-- 展开阅读全文 --
头像
织梦用户如何查看表单发送记录?
« 上一篇 昨天
dede列表分页为何会错位?
下一篇 » 昨天

相关文章

取消
微信二维码
支付宝二维码

目录[+]