Ответ 1
В документации для перечисления CalendarWeekRule указано, что она "не сопоставляется непосредственно с ISO 8601" и ссылки на Формат ISO 8601 Week of Year в Microsoft.Net - запись в блоге, в которой описываются различия.
Я нахожусь в середине расчета числа недель для дат, но System.Globalization.Calendar
возвращает нечетные результаты (среди других лет) 31 декабря 2007 и 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);
}
Результаты
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
?
В документации для перечисления CalendarWeekRule указано, что она "не сопоставляется непосредственно с ISO 8601" и ссылки на Формат ISO 8601 Week of Year в Microsoft.Net - запись в блоге, в которой описываются различия.
Посмотрите на значения CalendarWeekRule
. Вы используете FirstFourDayWeek
, и поэтому получаете значения, которые вы описываете. Если вы хотите каждую неделю иметь ровно 7 дней, вы должны использовать FirstFullWeek
.
В вашем случае это будет означать, что 31. 12. 2007 будет неделя 53, но так будет 2. 1. 2008.
Для идентификаторов недели не должно быть 52 недели, чтобы быть уникальными, у вас просто не обязательно 7 дней в конкретную неделю.
Если это проблема для вас, добавьте код для обработки кромки края.