> 백엔드 개발 > C++ > 본문

ISO 8601 표준을 기반으로 특정 날짜의 주 수를 어떻게 계산합니까?

Patricia Arquette
풀어 주다: 2024-11-12 09:02:01
원래의
397명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿