【问题标题】:System.Globalization.Calendar.GetWeekOfYear() returns odd resultsSystem.Globalization.Calendar.GetWeekOfYear() 返回奇数结果
【发布时间】:2012-01-10 18:56:59
【问题描述】:

我正在计算日期的周数,但 System.Globalization.Calendar 正在返回 2007 年 12 月 31 日和 2012 年 12 月 31 日(除其他年份外)的奇数结果。

Calendar calendar = CultureInfo.InvariantCulture.Calendar;
var date = new DateTime(2007, 12, 29);
for (int i = 0; i < 5; i++)
{
    int w = calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    Console.WriteLine("{0}\t{1}", date.ToString("dd.MM.yyyy"), w);
    date = date.AddDays(1);
}

结果

29.12.2007      52
30.12.2007      52
31.12.2007      53 <--
01.01.2008       1
02.01.2008       1

29.12.2012      52
30.12.2012      52
31.12.2012      53 <--
01.01.2013       1
02.01.2013       1

据我了解,2007 年和 2012 年不应该有第 53 周,但这些天应该包含在第 1 周。有没有办法在Calendar 中改变这种行为?

【问题讨论】:

  • “这些天应该包含在第 1 周”:根据哪个规则?根据我知道的规则,一年中的最后几天永远不会是明年第一周的一部分......
  • 根据 ISO 8601。en.wikipedia.org/wiki/ISO_8601
  • 顺便说一句,你为什么使用那种奇怪的日期格式?我想我从来没有见过写成2007.12.29的日期。
  • 你的答案解决了吗..??
  • @svick 它在yyyy-MM-dd 时按时间顺序排序,但为了便于阅读而进行了编辑

标签: c# .net calendar week-number


【解决方案1】:

documentation for the CalendarWeekRule enumeration 明确指出它“不直接映射到 ISO 8601”,并链接到描述差异的博客条目 ISO 8601 Week of Year format in Microsoft .Net

【讨论】:

  • 这解释了一切。谢谢
  • 我什至不想看解决方法。我的简单问题是:为什么?谁从中受益?为什么稍微改变,以至于你必须从十个日期中挑选两个才能看到不同?有点郁闷...
  • @Piddu 很可能是因为实现它的团队不了解标准,并且在发布后,他们不想对逻辑进行重大更改。这与 Unicode 的 .NET 实现形成对比,后者不符合标准,因为它早于标准。 (我不确定 ISO 8601 在 .NET 逻辑实施后没有改变,但 ISO 在 1976 年标准化了周数的计算,所以这似乎不太可能。另外值得注意的是,ISO 标准估计了星期一的那一周,这与美国的做法相冲突。)
【解决方案2】:

查看CalendarWeekRule 的值。您正在使用FirstFourDayWeek,因此您将获得您描述的值。如果您希望每周正好有 7 天,则应使用 FirstFullWeek

在您的情况下,这意味着 31. 12. 2007 将是第 53 周,但 2. 1. 2008 也是如此。

【讨论】:

  • 该解决方案不符合 ISO 8601,因为第一周大部分(四天或更多)天在起始年 [是第 1 周]
【解决方案3】:

从 .net core 3 开始,有一个新的 ISOWeek 实际上可以正确计算 WeekOfYear

https://docs.microsoft.com/en-us/dotnet/api/system.globalization.isoweek.getweekofyear

【讨论】:

    【解决方案4】:

    周标识符不一定要 52 周才能唯一,只是在特定周中不一定有 7 天。

    如果这对您来说是个问题,那么添加代码来处理边缘情况。

    【讨论】:

    • 一周总有7天。
    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多