Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah anda mengira nombor minggu tarikh tertentu berdasarkan piawaian ISO 8601?

Bagaimanakah anda mengira nombor minggu tarikh tertentu berdasarkan piawaian ISO 8601?

Patricia Arquette
Patricia Arquetteasal
2024-11-12 09:02:01404semak imbas

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

Mengira Nombor Minggu Diberi Tarikh

Dalam banyak aplikasi, adalah penting untuk menentukan nombor minggu untuk tarikh tertentu. Maklumat ini berguna dalam industri seperti perancangan dan penjadualan. Artikel ini meneroka algoritma dan contoh kod untuk mengira nombor minggu berdasarkan ISO 8601.

Definisi ISO 8601

Piawaian ISO 8601 mentakrifkan nombor minggu berdasarkan peraturan berikut:

  • Minggu 1 dalam setahun ialah minggu yang mengandungi hari Khamis tahun itu.
  • Minggu bermula pada hari Isnin dan berakhir pada hari Ahad.
  • Nombor tahun nombor minggu adalah sama dengan tahun Gregorian yang mengandungi majoriti harinya.

Algoritma

Untuk mengira nombor minggu, ikut ini langkah:

  1. Tentukan tarikh hari pertama (Isnin) minggu pertama (d1w1) tahun tertentu menggunakan fungsi day_one_week_one.
  2. Kira bilangan hari antara tarikh yang diberikan dan d1w1 untuk menentukan delta.
  3. Bahagikan delta dengan 7 dan potong hasilnya kepada dapatkan nombor minggu penuh (wn).
  4. Kendalikan kes tepi di mana tarikh yang diberikan adalah pada minggu terakhir tahun sebelumnya atau minggu pertama tahun berikutnya dengan melaraskan nombor tahun dan d1w1 sewajarnya.

Contoh Kod 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;
}

Dalam contoh ini, tarikh yang diberikan ialah Januari 10, 2008, yang jatuh pada Minggu 2 tahun 2008, sepadan dengan output yang dijangkakan. Kod boleh disesuaikan untuk memproses format tarikh yang berbeza dan mengendalikan kes tepi seperti yang diperlukan.

Atas ialah kandungan terperinci Bagaimanakah anda mengira nombor minggu tarikh tertentu berdasarkan piawaian ISO 8601?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn