首頁 >後端開發 >C++ >如何根據 ISO 8601 標準計算給定日期的周數?

如何根據 ISO 8601 標準計算給定日期的周數?

Patricia Arquette
Patricia Arquette原創
2024-11-12 09:02:01436瀏覽

How do you calculate the week number of a given date based on the ISO 8601 standard?

計算給定日期的周數

在許多應用程式中,確定給定日期的周數至關重要。此資訊在規劃和調度等行業非常有用。本文探討了基於 ISO 8601 計算週數的演算法和程式碼範例。

ISO 8601 定義

ISO 8601 標準定義了基於ISO 8601 的周數遵循以下規則:

  • 一年中的第一個規則一週包含該年的星期四。
  • 每週從星期一開始,到星期日結束。
  • 週數的年份與包含其大部分天數的公曆年相同。

演算法

要計算週數,請執行以下操作這些步驟:

  1. 使用day_one_week_one 函數決定給定年份第一週(d1w1) 的第一天(星期一)的日期。
  2. 計算之間的天數給定日期和 d1w1 來決定增量。
  3. 將增量除以 7 並截斷結果以獲得整週數 (wn)。
  4. 處理給定日期所在位置的邊緣情況透過相應地調整年份編號和 d1w1 來獲取上一年的最後一周或下一年的第一周。

C 程式碼範例

#include <iostream>
#include <chrono>

using namespace std;

// Date manipulation functions
int getYear(tm* date);
int getMonth(tm* date);
int getDay(tm* date);
int getWeek(tm* date);

// Algorithm for calculating week number based on ISO 8601
int getWeek(tm* date) {
    // Calculate d1w1, the first day (Monday) of the first week (Week 1) of the year
    tm d1w1 = *date;
    d1w1.tm_mon = 0;  // January (0-based month)
    d1w1.tm_mday = 1;  // First day of the month
    d1w1.tm_wday = 1;  // Monday (1-based day of the week)
    // Get the number of days between the given date and d1w1
    time_t t1 = mktime(&d1w1);
    time_t t2 = mktime(date);
    int delta = int((t2 - t1) / (24 * 60 * 60));
    // Calculate the week number
    int wn = delta / 7 + 1;
    // Handle edge cases (last week of previous year or first week of next year)
    int year = getYear(date);
    if (delta < 0) {
        // Given date is in the last week of the previous year
        year--;
        d1w1.tm_year = year - 1900;
        t1 = mktime(&d1w1);
        delta = int((t2 - t1) / (24 * 60 * 60));
        wn = delta / 7 + 1;
    } else if (getDay(date) == 1 && getMonth(date) == 0 && wn == 1) {
        // Given date is on January 1st (Monday), so it's in the last week of the previous year
        year--;
        d1w1.tm_year = year - 1900;
        t1 = mktime(&d1w1);
        delta = int((t2 - t1) / (24 * 60 * 60));
        wn = delta / 7 + 1;
    }
    return wn;
}

int main() {
    struct tm date;
    // Example date: January 10, 2008
    date.tm_year = 2008 - 1900;  // tm_year uses years since 1900
    date.tm_mon = 0;             // Months are 0-based
    date.tm_mday = 10;
    int weekNumber = getWeek(&date);
    cout << "Week number for January 10, 2008: " << weekNumber << endl;
    return 0;
}

在此範例中,給定日期是2008 年1 月10 日,即2008 年第2 週,對應預期輸出。該程式碼可以適應處理不同的日期格式並根據需要處理邊緣情況。

以上是如何根據 ISO 8601 標準計算給定日期的周數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn