System.Globalization.Calendar.GetWeekOfYear() returns odd results
-
26-10-2019 - |
Question
I'm in the middle of calculating week numbers for dates, but the System.Globalization.Calendar
is returning odd results for (amongst other years) December 31st of year 2007 and 2012.
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);
}
Results
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
As far as I understand, there shouldn't be a week 53 in year 2007 and 2012, but the days should be included in week 1. Is there a way to change this behaviour in the Calendar
?
Solution
The documentation for the CalendarWeekRule enumeration specifically states that it "does not map directly to ISO 8601", and links to ISO 8601 Week of Year format in Microsoft .Net, a blog entry that describes the differences.
OTHER TIPS
Have a look at the values of CalendarWeekRule
. You are using FirstFourDayWeek
, and so you are getting the values you describe. If you want every week to have exactly 7 days, you should use FirstFullWeek
.
In your case, that would mean that 31. 12. 2007 will be week 53, but so will 2. 1. 2008.
There don't have to be 52 weeks for the week identifiers to be unique, you just don't necessarily have 7 days in a particular week.
If this is a problem for you then add code to handle the edge case.