Определение календарного года (с / без високосных лет) - PullRequest
0 голосов
/ 14 июля 2011

ОБНОВЛЕНИЕ: Мораль этой истории - доверять внутренним чувствам, а не искать проблемы.В конце концов, пользователь сообщил, что проблема была в совершенно другой области, и, как подчеркнул Джон, в нашем тестировании мы обнаружили ошибку, которую мы пропустили, потому что результат, по-видимому, подтвердил то, что искали.

Оригинальный вопрос:

Во многих приложениях требуется отображать дату начала / окончания, где дата окончания охватывает один календарный год.Поэтому, если начальная дата - 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)» для быстрого определения календарного года

Ответы [ 2 ]

4 голосов
/ 14 июля 2011

Мне кажется, что "настоящие" версии верны ... с чего бы вы ожидали"один год минус день" с 28 по 26 февраля? Как вы можете сказать, что он охватывает календарный год, если 27 февраля нигде не указано?

Если вы действительно хотите эти значения, вы рассматривали просто вызов AddDays(364) вместо этого?

0 голосов
/ 14 июля 2011

Я, должно быть, упускаю что-то действительно очевидное, как будто я ставлю 1 марта 2011 года и делаю addyear-1day, я получаю, как и я, как человек, ожидающий 29-го февраля 2012 года, если я делаю 28-е февраля 2012 addyear-1day, я получаю 27 февраля 2013 .. если вы просто хотите добавить 365 дней, сделайте это. я немного смущен. Таким образом, ваши реальные цели выглядят правильно.

Требуется больше кофе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...