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

C語言計算生存天數:從出生日期到今日的精確天數差

     編輯:C 語言問答

日期差值計算核心算法

計算兩個日期間的天數差,標準方法是將各日期轉換為「從基準日(如公元1年1月1日)起的總天數」,相減即得差值。

累積天數函數

long dateToDays(int y, int m, int d) {
    static const int monthDays[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    long total = 0;
    
    // 累積完整年份天數
    for (int i = 1; i < y; i++)
        total += isLeapYear(i) ? 366 : 365;
    
    // 累積完整月份天數
    if (isLeapYear(y)) monthDays[2] = 29;
    for (int i = 1; i < m; i++)
        total += monthDays[i];
    
    // 加上當月天數
    total += d;
    return total;
}

完整程式:計算生存天數

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

int isLeapYear(int y) {
    return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}

long dateToDays(int y, int m, int d) {
    int monthDays[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    long days = 0;
    for (int i = 1; i < y; i++)
        days += isLeapYear(i) ? 366 : 365;
    if (isLeapYear(y)) monthDays[2] = 29;
    for (int i = 1; i < m; i++)
        days += monthDays[i];
    return days + d;
}

int main() {
    int by, bm, bd;
    printf("輸入出生日期 (年 月 日): ");
    scanf("%d %d %d", &by, &bm, &bd);
    
    // 獲取系統當前日期
    time_t now = time(NULL);
    struct tm *t = localtime(&now);
    int cy = t->tm_year + 1900;
    int cm = t->tm_mon + 1;
    int cd = t->tm_mday;
    
    long birthDays = dateToDays(by, bm, bd);
    long currentDays = dateToDays(cy, cm, cd);
    long livedDays = currentDays - birthDays;
    
    printf("出生日期: %04d-%02d-%02d\n", by, bm, bd);
    printf("今日日期: %04d-%02d-%02d\n", cy, cm, cd);
    printf("生存天數: %ld 天\n", livedDays);
    
    return 0;
}

關鍵技術點

  • 使用 time.h 獲取系統日期,避免手動輸入今日日期
  • 基準日選擇公元1年1月1日,確保長跨度計算正確
  • 閏年判斷嚴格遵循格里曆規則
  • 長整型 (long) 防止天數溢出(約支援200萬年)

擴展應用

同樣邏輯可用於:計算兩日期間隔、倒數日提醒、年齡精確計算、金融利息天數計算等場景。

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