日付を指定した週番号の計算
多くのアプリケーションでは、指定された日付の週番号を決定することが不可欠です。この情報は、計画やスケジューリングなどの業界で役立ちます。この記事では、ISO 8601 に基づいて週番号を計算するアルゴリズムとコード例について説明します。
ISO 8601 定義
ISO 8601 標準は、次の基準に基づいて週番号を定義します。次のルール:
アルゴリズム
週番号を計算するには、次の手順を実行します。これらの手順:
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 サイトの他の関連記事を参照してください。