System.Globalization.Calendar.GetWeekOfYear()返回奇数结果

我正在计算日期的周数,但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更改此行为?

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

看看CalendarWeekRule的值。 您正在使用FirstFourDayWeek ,因此您获得了所描述的值。 如果您希望每周都有7天,那么您应该使用FirstFullWeek

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

星期标识符不必是52周独特的,您不一定在特定的一周内有7天。

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