问题
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
?
回答1:
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.
回答2:
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.
回答3:
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.
来源:https://stackoverflow.com/questions/8808878/system-globalization-calendar-getweekofyear-returns-odd-results