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

时间:2012-01-10 18:57:00

标签: c# .net calendar week-number

我正在计算日期的周数,但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中改变这种行为?< / p>

4 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

如果您遇到问题,请添加代码以处理边缘情况。

答案 3 :(得分:0)

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

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