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