ホームページ >バックエンド開発 >C++ >ISO 8601 標準に基づいて、特定の日付の週番号をどのように計算しますか?

ISO 8601 標準に基づいて、特定の日付の週番号をどのように計算しますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-12 09:02:01404ブラウズ

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

日付を指定した週番号の計算

多くのアプリケーションでは、指定された日付の週番号を決定することが不可欠です。この情報は、計画やスケジューリングなどの業界で役立ちます。この記事では、ISO 8601 に基づいて週番号を計算するアルゴリズムとコード例について説明します。

ISO 8601 定義

ISO 8601 標準は、次の基準に基づいて週番号を定義します。次のルール:

  • 年の第 1 週は、その年の木曜日が含まれる週です。
  • 週は月曜日に始まり、日曜日に終わります。
  • 週番号の年番号は、その日の大部分を含むグレゴリオ暦の年と同じです。

アルゴリズム

週番号を計算するには、次の手順を実行します。これらの手順:

  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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。