我正在计算日期的周数,但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>
答案 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