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

C++ 日期工具類:計算星期幾、年間第幾天、判斷閏年

     編輯:關於C++

設計目標

輸入年月日,輸出:星期幾(0-6 代表周日-周六)、該日期是年間第幾天、是否閏年。支援輸入驗證。

核心算法

1. 閏年判斷

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

2. 積累天數計算(儒略日數變體)

從 0001-01-01 起算總天數,模 7 得星期:

int dayCount(int y, int m, int d) {
    // 前 y-1 年總天數 + 當年前 m-1 月天數 + 當月天數
    int days = (y - 1) * 365 + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400;
    static const int monthDays[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    for (int i = 0; i < m - 1; ++i) days += monthDays[i];
    if (m > 2 && isLeapYear(y)) ++days;  // 閏年2月後加1
    return days + d;
}

3. 星期計算

int weekDay(int y, int m, int d) {
    return dayCount(y, m, d) % 7;  // 0=Sun, 1=Mon, ..., 6=Sat
}

4. 年間第幾天

int dayOfYear(int y, int m, int d) {
    static const int monthDays[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int days = d;
    for (int i = 0; i < m - 1; ++i) days += monthDays[i];
    if (m > 2 && isLeapYear(y)) ++days;
    return days;
}

完整類實現

#include 
#include 
using namespace std;

class Date {
    int y, m, d;
public:
    Date(int year, int month, int day) : y(year), m(month), d(day) {
        if (!valid()) throw invalid_argument("Invalid date");
    }
    
    bool valid() const {
        if (y <= 0 || m < 1 || m > 12 || d < 1) return false;
        static const int md[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
        int dim = md[m-1];
        if (m == 2 && isLeapYear(y)) dim = 29;
        return d <= dim;
    }
    
    static bool isLeapYear(int y) {
        return (y%4==0 && y%100!=0) || (y%400==0);
    }
    
    int dayOfYear() const {
        static const int md[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
        int days = d;
        for (int i = 0; i < m-1; ++i) days += md[i];
        if (m > 2 && isLeapYear(y)) ++days;
        return days;
    }
    
    int totalDays() const {  // 從 0001-01-01 起算
        int days = (y-1)*365 + (y-1)/4 - (y-1)/100 + (y-1)/400;
        days += dayOfYear();
        return days;
    }
    
    int weekDay() const { return totalDays() % 7; }  // 0=Sun
    
    void print() const {
        const char* wd[7] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
        cout << y << '-' << m << '-' << d << " is " << wd[weekDay()] 
             << ", day " << dayOfYear() << " of year"
             << (isLeapYear(y) ? " (leap)" : " (common)") << '\n';
    }
};

int main() {
    int y, m, d;
    while (cin >> y >> m >> d) {
        try {
            Date dt(y, m, d);
            dt.print();
        } catch (exception& e) {
            cout << "Invalid date\n";
        }
    }
}

測試樣例

輸入:2024 2 29
輸出:2024-2-29 is Thursday, day 60 of year (leap)

輸入:2023 12 31
輸出:2023-12-31 is Sunday, day 365 of year (common)

擴展建議

  • 加入 operator- 計算兩日期天數差
  • 支援字串解析(YYYY-MM-DD、DD/MM/YYYY 等格式)
  • 使用 std::chrono (C++20) 替代手動實現
  • 添加儒略日/修正儒略日轉換支援天文計算
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved