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

C 語言日期計算:輸入日期輸出第二天(標準庫 time.h 實現)

     編輯:關於C語言

日期運算最佳實踐:用 `mktime`/`gmtime` 自動處理閏年、月份天數、跨年

手寫日期加減邏輯極易出錯(閏年、大小月、跨年/跨世紀)。C 標準庫 `` 提供 `struct tm`、`mktime`、`gmtime`/`localtime`,能自動處理所有日曆規則。本文演示輸入「YYYY/MM/DD」格式,輸出第二天日期的標準實現。

核心代碼

#include 
#include 
#include 
#include 

#define SECONDS_PER_DAY (60 * 60 * 24)

void nextDay(char *dateStr) {
    struct tm tm = {0};
    time_t seconds;
    char *p;

    // 1. 解析字符串
    p = strtok(dateStr, "/");
    tm.tm_year = atoi(p) - 1900;  // tm_year: 年份-1900
    p = strtok(NULL, "/");
    tm.tm_mon = atoi(p) - 1;      // tm_mon: 0-11
    p = strtok(NULL, "/");
    tm.tm_mday = atoi(p);         // tm_mday: 1-31

    // 2. 設置固定時間(避免 DST 歧義)
    tm.tm_hour = 12; tm.tm_min = 0; tm.tm_sec = 0;
    tm.tm_isdst = -1; // 讓 mktime 自動判斷夏令時

    // 3. 轉為 time_t 並加一天
    seconds = mktime(&tm) + SECONDS_PER_DAY;

    // 4. 轉回 tm 並格式化輸出
    struct tm *next = gmtime(&seconds); // 或 localtime 視時區需求
    printf("%d/%d/%d\n",
           next->tm_year + 1900,
           next->tm_mon + 1,
           next->tm_mday);
}

int main() {
    char input[20];
    printf("請輸入日期 (YYYY/MM/DD):");
    scanf("%19s", input);
    nextDay(input);
    return 0;
}

關鍵點解析

步驟函數/字段說明
解析strtok/atoi分割字符串,轉整數
填充 tmtm_year/mon/mday注意年份-1900、月份-1
固定時分秒tm_hour=12避免午夜 DST 切換導致日期跳變
轉時間戳mktime()自動修正無效日期(如 2/30→3/2),返回 time_t
加一天+ 86400time_t 通常以秒為單位
轉回日曆gmtime/localtimegmtime 為 UTC,localtime 為本地時區
格式化輸出tm_year/mon/mday還原年/月/日

測試用例

輸入:2004/12/31  → 輸出:2005/1/1     (跨年)
輸入:2020/2/28   → 輸出:2020/2/29    (閏年)
輸入:2021/2/28   → 輸出:2021/3/1     (平年)
輸入:2023/1/31   → 輸出:2023/2/1     (大月→小月)
輸入:2023/4/30   → 輸出:2023/5/1     (30天月份)

擴展建議

  • 輸入驗證:檢查 `strtok` 返回值、範圍合法性。
  • 任意天數增減:將 `SECONDS_PER_DAY` 替換為 `days * 86400`。
  • 格式化輸出:用 `strftime(buf, sizeof(buf), "%Y/%m/%d", next)` 更優雅。
  • 時區敏感場景:統一用 UTC (`gmtime`/`timegm`),避免 DST 陷阱。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved