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天。
如果这对您来说是个问题,那么添加代码来处理边缘情况。