从日期时间获取星期数

Álv*_*cía 5 c# week-number

我试图从日期时间获取星期数,在我的情况下,一周的第一天是星期一,我想遵循FirstFourDays约定。

要检查结果,请检查以下网页:

https://espanol.epochconverter.com/semanas/2020

要获取星期数,我使用以下方法:

System.Globalization.CultureInfo.InvariantCulture.Calendar.GetWeekOfYear();
Run Code Online (Sandbox Code Playgroud)

所以我想获取日期2019-12-29的星期数,所以我使用以下代码:

System.Globalization.CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(new DateTime(2019, 12, 29), System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
Run Code Online (Sandbox Code Playgroud)

结果是第52周。这是正确的。

现在我正在尝试获取2019-12-30的星期数,我得到的星期数是53,这是错误的,因为2019只有52周。实际上,2019-12-30与2020-01-01属于同一周,这是正确的第一周,所以我不明白为什么我可以在同一日期获得两个不同的结果。

我怎么总是能得到正确的结果?还是获取任何日期的星期数的正确方法是什么?

Com*_*eak 4

有一篇博客文章解释了这种行为并提出了解决方案。

问题:

有些人已经注意到,Calendar.GetWeekOfYear() 几乎就像传递 CalendarWeekRule.FirstFourDayWeek 和 DayOfWeek.Monday 时的 ISO 8601 周一样,但它有点不同。具体来说,ISO 8601 每周总是有 7 天。如果一年的第一周不包含星期四,则将其算作上一年的最后一周。同样,如果上一年的最后一周不包含星期四,则将其视为下一年的第一周。GetWeekOfYear() 有第一个行为,但没有第二个行为。

建议的解决方案是这样的:

一致获得 ISO 8601 周的一个简单解决方法是认识到 ISO 8601 周中周一到周日的连续几天都具有相同的周#。所以星期一和星期四是同一周。由于星期四是确定每年一周何时开始的关键日,因此如果这一天是星期一、星期二或星期三,我的解决方案是添加 3 天。调整后的天数仍然在同一周内,并使用 GetWeekOfYear 和 ISO 8601 一致的值。

// This presumes that weeks start with Monday.
// Week 1 is the 1st week of the year with a Thursday in it.
public static int GetIso8601WeekOfYear(DateTime time)
{
    // Seriously cheat.  If its Monday, Tuesday or Wednesday, then it'll 
    // be the same week# as whatever Thursday, Friday or Saturday are,
    // and we always get those right
    DayOfWeek day = cal.GetDayOfWeek(time);
    if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
    {
        time = time.AddDays(3);
    }

    // Return the week of our adjusted day
    return cal.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}
Run Code Online (Sandbox Code Playgroud)

所有功劳均归于肖恩·斯蒂尔 (Shawn Steele)