Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

System.Globalization.Calendar.GetWeekOfYear() returns odd results

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?

like image 530
sshow Avatar asked Jan 10 '12 18:01

sshow


People also ask

How do I get the current week number in C#?

You can retrieve the current week number in Schedule control by using the GetWeekOfYear method. In this method, define the CalendarWeekRule class and DayOfWeek class. The CalendarWeekRule class is used to get the first week of the year and the DayOfWeek class is used to get the first day of the week.

What is CalendarWeekRule?

CalendarWeekRule property and is used by the culture's current calendar to determine the calendar week rule. The enumeration value is also used as a parameter to the Calendar. GetWeekOfYear method. Calendar week rules depend on the System.


2 Answers

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.

like image 74
phoog Avatar answered Oct 13 '22 22:10

phoog


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.

like image 34
svick Avatar answered Oct 13 '22 23:10

svick