Maison >développement back-end >C++ >Comment calculer le numéro de semaine d'une date donnée en fonction de la norme ISO 8601 ?

Comment calculer le numéro de semaine d'une date donnée en fonction de la norme ISO 8601 ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-12 09:02:01438parcourir

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

Calcul du numéro de semaine pour une date

Dans de nombreuses applications, il est essentiel de déterminer le numéro de semaine pour une date donnée. Ces informations sont utiles dans des secteurs tels que la planification et l’ordonnancement. Cet article explore un algorithme et un exemple de code pour calculer le numéro de semaine basé sur la norme ISO 8601.

Définition ISO 8601

La norme ISO 8601 définit un numéro de semaine basé sur les règles suivantes :

  • La semaine 1 d'une année est celle qui contient le jeudi de celle-ci année.
  • Les semaines commencent le lundi et se terminent le dimanche.
  • Le numéro d'année d'un numéro de semaine est le même que l'année grégorienne contenant la majorité de ses jours.

Algorithme

Pour calculer le numéro de la semaine, suivez ces étapes :

  1. Déterminez la date du premier jour (lundi) de la première semaine (d1w1) de l'année donnée à l'aide de la fonction day_one_week_one.
  2. Calculez le nombre de jours entre les date donnée et d1w1 pour déterminer le delta.
  3. Divisez le delta par 7 et tronquez le résultat pour obtenir le numéro de la semaine entière (wn).
  4. Gérez les cas extrêmes où la date donnée se situe dans la dernière semaine de l'année précédente ou la première semaine de l'année suivante en ajustant le numéro de l'année et d1w1 en conséquence.

Exemple de code 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;
}

Dans cet exemple, la date donnée est le 10 janvier 2008, qui tombe dans la semaine 2 de 2008, correspondant à la production attendue. Le code peut être adapté pour traiter différents formats de date et gérer les cas extrêmes selon les besoins.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn