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

本文关键字:返回 结果 Globalization Calendar GetWeekOfYear System | 更新日期: 2023-09-27 18:19:52

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

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

CalendarWeekRule枚举的文档特别指出;不直接映射到ISO 8601";,并链接到Microsoft.Net中的ISO 8601年度周格式,这是一个描述差异的博客条目。

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

在你的情况下,这意味着31。12.2007年是第53周,但第2周也是。2008年1月1日。

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

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

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

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