首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

C 語言計算「下一天」日期:閏年判斷、月份天數與錯誤處理完整實現

     編輯:更多程式設計知識

「給定日期,求第二天」是曆法計算的入門經典,涉及閏年規則、大小月邊界、年末跨年等邊界條件。本文提供一個健壯的 C 實現,包含輸入解析、合法性校驗、日期遞增、錯誤時調用系統 cal 命令輔助查看,並支持交互式循環測試。

核心邏輯:閏年與月份天數

// 閏年判斷:400 整除 或 4 整除但不整除 100
int is_leap(int y) { return (y%4==0 && y%100!=0) || (y%400==0); }

// 月份天數表(索引 1~12)
const int mdays[13] = {0, 31,28,31,30,31,30,31,31,30,31,30,31};

// 獲取指定年月的天數
int month_days(int y, int m) {
    if (m == 2) return is_leap(y) ? 29 : 28;
    return mdays[m];
}

日期遞增算法 next_day()


// 返回 0 成功,-1 輸入非法
int next_day(int *y, int *m, int *d) {
    if (*m < 1 || *m > 12) return -1;
    int dim = month_days(*y, *m);
    if (*d < 1 || *d > dim) return -1;

    (*d)++;
    if (*d > dim) {          // 月底跨月
        *d = 1;
        (*m)++;
        if (*m > 12) {       // 年底跨年
            *m = 1;
            (*y)++;
        }
    }
    return 0;
}

完整交互程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main() {
    int y, m, d;
    char cmd[64], ch, c;
    time_t now;

    do {
        printf("輸入年月日(YYYY-MM-DD):");
        if (scanf("%d-%d-%d", &y, &m, &d) != 3) {
            while ((c=getchar())!='\n' && c!=EOF);
            printf("格式錯誤,請用 YYYY-MM-DD\n"); continue;
        }

        if (next_day(&y, &m, &d) == 0) {
            printf("第二天為 %04d-%02d-%02d。\n", y, m, d);
        } else {
            printf("日期輸入錯誤,調用 cal 查看 %d 年 %d 月:\n\n", y, m);
            sprintf(cmd, "/usr/bin/cal %d %d", m, y);
            system(cmd);
            // system("clear"); // 可選清屏
        }

        while ((c=getchar())!='\n' && c!=EOF);
        printf("繼續測試(y/n):");
        ch = getchar();
    } while (ch=='y' || ch=='Y');

    time(&now);
    printf("Now is %s", ctime(&now));
    puts("Have a good day!");
    return 0;
}

關鍵測試用例

輸入輸出驗證點
2023-01-312023-02-01大月底跨月
2023-02-282023-03-01平年 2 月底
2024-02-292024-03-01閏年 2 月底
2023-12-312024-01-01年末跨年
2023-04-31錯誤 + cal 4月小月 31 日非法
2023-13-01錯誤月份越界

工程化擴展方向

  1. 標準庫替代:生產代碼首選 <time.h> struct tm + mktime() 自動處理閏年/跨月/跨年/時區/DST,避免手寫邏輯 Bug。
  2. 跨平台 cal:Windows 無 cal,可改用 system("cmd /c date") 或自行打印月曆。
  3. 日期區間迭代器:封裝 DateRange(start, end) 實現 ++it 自動遞增,支援範圍 for 循環。
  4. 儒略日算法:大跨度日期差值/星期計算,轉儒略日數一行搞定:JDN = (1461*(Y+4800+(M-14)/12))/4 + (367*(M-2-12*((M-14)/12)))/12 - (3*((Y+4900+(M-14)/12)/100))/4 + D - 32075。
  5. 國際化:引入 ICU 庫處理不同曆法(農曆、波斯曆、希伯來曆)。

手寫「下一天」是理解曆法邊界條件的最佳練習;實際項目中,**請毫不猶豫使用成熟的時間庫**。理解底層邏輯,是為了在庫出 Bug 時能精準定位、在庫不支持場景時能手寫兜底。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved