【问题标题】:Get the week number from a date time [duplicate]从日期时间获取周数[重复]
【发布时间】:2019-01-03 16:43:16
【问题描述】:

我试图从日期时间获取周数,就我而言,一周的第一天是星期一,我想遵循 FirstFourDays 约定。

为了查看结果,我正在查看这个网页:

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

要获取周数,我使用方法:

System.Globalization.CultureInfo.InvariantCulture.Calendar.GetWeekOfYear();

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

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

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

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

我怎样才能始终得到正确的结果?或者如何正确获取任何日期的周数?

【问题讨论】:

标签: c# week-number


【解决方案1】:

blog article 解释了这种行为并提出了解决方案。

问题:

很多人已经注意到 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);
}

所有功劳归Shawn Steele

【讨论】:

    猜你喜欢
    • 2018-12-16
    • 2016-11-09
    • 2021-11-08
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多