首頁 >後端開發 >C++ >如何使用 ISO 8601 計算給定年份和週數的一周的第一天?

如何使用 ISO 8601 計算給定年份和週數的一周的第一天?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-14 12:58:48203瀏覽

How to Calculate the First Day of a Week Given Year and Week Number Using ISO 8601?

基於 ISO 8601 標準精確計算日期

根據年份和週數找到特定一周的第一天看似簡單,但如果使用ISO 8601 標準,則會變得複雜,因為該標準規定一周的第一天在歐洲是星期一,但在標準中是星期四。

為了精確計算日期,我們先決定一年的第一個星期四。這確保我們始終處於正確的年份,無論一年的第一周是否跨越兩個日曆年。

如果一年的第一週是第 1 週,則從給定的周數中減去 1,以考慮起始日期的差異。

最後,我們將週數乘以 7 天的結果加到第一個星期四,以獲得指定週的第一天。但是,為了符合 ISO 8601 定義,我們將從結果星期四中減去 3 天以獲得星期一,這是標準中的第一天。

以下是用 C# 程式碼實現 ISO 8601 約定的範例:

<code class="language-csharp">public static DateTime FirstDateOfWeekISO8601(int year, int weekOfYear)
{
    DateTime jan1 = new DateTime(year, 1, 1);
    int daysOffset = DayOfWeek.Thursday - jan1.DayOfWeek;

    // 使用一月份的第一个星期四获取一年的第一周
    DateTime firstThursday = jan1.AddDays(daysOffset);
    var cal = CultureInfo.CurrentCulture.Calendar;
    int firstWeek = cal.GetWeekOfYear(firstThursday, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

    var weekNum = weekOfYear;
    // 由于我们正在向第 1 周的日期添加天数,
    // 因此我们需要减去 1 才能获得第 1 周的正确日期
    if (firstWeek == 1)
    {
        weekNum -= 1;
    }

    // 使用第一个星期四作为起始周确保我们从正确的年份开始
    // 然后我们将周数乘以天数的结果相加
    var result = firstThursday.AddDays(weekNum * 7);

    // 从星期四减去 3 天以获得星期一,这是 ISO8601 中的第一天
    return result.AddDays(-3);
}</code>

使用此方法,您可以根據年份和週數精確計算一週的第一天,確保符合 ISO 8601 標準。

以上是如何使用 ISO 8601 計算給定年份和週數的一周的第一天?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn