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
?
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.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With