ОБНОВЛЕНИЕ: Мораль этой истории - доверять внутренним чувствам, а не искать проблемы.В конце концов, пользователь сообщил, что проблема была в совершенно другой области, и, как подчеркнул Джон, в нашем тестировании мы обнаружили ошибку, которую мы пропустили, потому что результат, по-видимому, подтвердил то, что искали.
Оригинальный вопрос:
Во многих приложениях требуется отображать дату начала / окончания, где дата окончания охватывает один календарный год.Поэтому, если начальная дата - 1 января 2012 года, конечная дата - 31 декабря 2012 года. Основное правило - добавить год, в качестве метода расширения используйте выходной:
public static DateTime CalendarYear(this DateTime dateTime)
{
return dateTime.AddYears(1).AddDays(-1);
}
Однако приведенный выше код не справляется с високосными годами !Наши модульные тесты выявили 365 случаев, когда ожидаемая дата не соответствовала определенной дате окончания при тестировании с начальной даты с 1 января 2011 по 31 декабря 2014 года. Даты, определяющие границы ошибок:
- Дата начала: 01 марта 2011 года, ожидаемая дата окончания: 28 февраля 2012 года: фактическая дата окончания: 29 февраля 2012 года
- Дата начала: 28 февраля 2012 года, ожидаемая дата окончания: 26 февраля 2013 года: фактическая дата окончания:27 февраля 2013 года
Даты до 1 марта 2011 года ведут себя как ожидалось, даты после 28 февраля 2012 года ведут себя как ожидалось.
Я знаю, что причина неудачных тестов в том, что старт /даты окончания содержат событие високосного года 29 февраля, но есть ли у кого-нибудь простое, надежное предложение (которое справляется с событием високосного года) для замены базового «AddYears (1) .AddDays (-1)» для быстрого определения календарного года