Heim  >  Artikel  >  Backend-Entwicklung  >  Wie berechnet man die Wochennummer eines bestimmten Datums basierend auf der ISO 8601-Norm?

Wie berechnet man die Wochennummer eines bestimmten Datums basierend auf der ISO 8601-Norm?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-12 09:02:01397Durchsuche

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

Berechnung der Wochennummer anhand eines Datums

In vielen Anwendungen ist es wichtig, die Wochennummer für ein bestimmtes Datum zu ermitteln. Diese Informationen sind in Branchen wie Planung und Terminierung nützlich. In diesem Artikel werden ein Algorithmus und ein Codebeispiel zur Berechnung der Wochennummer basierend auf ISO 8601 untersucht.

ISO 8601-Definition

Der ISO 8601-Standard definiert eine Wochennummer basierend auf die folgenden Regeln:

  • Woche 1 eines Jahres ist diejenige, die den Donnerstag dieses Jahres enthält.
  • Wochen beginnen am Montag und enden am Sonntag.
  • Die Jahreszahl einer Wochenzahl ist die gleiche wie das gregorianische Jahr, das die meisten seiner Tage enthält.

Algorithmus

Um die Wochenzahl zu berechnen, folgen Sie den Anweisungen Diese Schritte:

  1. Bestimmen Sie das Datum des ersten Tages (Montag) der ersten Woche (d1w1) des angegebenen Jahres mit der Funktion day_one_week_one.
  2. Berechnen Sie die Anzahl der Tage dazwischen das angegebene Datum und d1w1, um das Delta zu bestimmen.
  3. Dividieren Sie das Delta durch 7 und kürzen Sie das Ergebnis, um die ganze Wochennummer (wn) zu erhalten.
  4. Behandeln Sie Randfälle, in denen das angegebene Datum liegt B. die letzte Woche des Vorjahres oder die erste Woche des nächsten Jahres, indem Sie die Jahreszahl und d1w1 entsprechend anpassen.

C-Codebeispiel

#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;
}

In diesem Beispiel ist das angegebene Datum der 10. Januar 2008, der in Woche 2 des Jahres 2008 fällt, was der erwarteten Ausgabe entspricht. Der Code kann angepasst werden, um verschiedene Datumsformate zu verarbeiten und Randfälle nach Bedarf zu behandeln.

Das obige ist der detaillierte Inhalt vonWie berechnet man die Wochennummer eines bestimmten Datums basierend auf der ISO 8601-Norm?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn