18

我正在计算日期的周数,但System.Globalization.Calendar正在返回 2007 年和 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

4

4 回答 4

16

CalendarWeekRule 枚举的文档明确指出它“不直接映射到 ISO 8601”,并链接到Microsoft .Net 中的 ISO 8601 Week of Year 格式,这是一个描述差异的博客条目。

于 2012-01-10T19:22:24.677 回答
2

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

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

于 2012-01-10T19:12:33.377 回答
1

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

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

于 2020-02-06T15:17:56.957 回答
0

一周标识符不必有 52 周是唯一的,只是在特定一周中不一定有 7 天。

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

于 2012-01-10T19:05:36.887 回答