2016-08-17 1 views
-2

У меня проблемы с GregorianCalender Java 1.7. Я знаю переход на Java 8 или использование Joda может решить мою проблему, но, к сожалению, это не вариант.Java 1.7 GregorianCalendar вычисляет неверную дату

Итак, я пытаюсь добавить 365 дней для расчета даты окончания (может показаться глупым добавить 365 дней, а не просто добавить год, но это то, что мой клиент запросил, и даже после того, как он спросил его много раз, он хочет придерживаться с ним, потому что он хочет игнорировать високосные годы).

В целом все работает хорошо, но в следующем модульном тесте он терпит неудачу в его и моем ожидании. Я пересчитал его несколько раз и использовал различные инструменты для проверки моих результатов, но я просто не могу подтвердить вычисления Java.

Вот мой блок тест, который потерпит неудачу, потому что она возвращает неправильную дату:

@Test 
public void test(){ 
    // Get a Gregorian Calendar 
    Calendar cal = GregorianCalendar.getInstance(); 

    // Remove whatever was stored previously 
    cal.clear(); 

    // Set calendar to 2004-10-23 
    cal.set(2004, Calendar.OCTOBER, 23); 

    // Add 365 days 
    cal.add(Calendar.DAY_OF_YEAR, 365); 

    // Calendar should be at 2005-10-22 now 
    Assert.assertEquals(2005, cal.get(Calendar.YEAR)); 
    Assert.assertEquals(Calendar.OCTOBER, cal.get(Calendar.MONTH)); 
    Assert.assertEquals(22, cal.get(Calendar.DAY_OF_MONTH)); 
} 

Он подведет с:

java.lang.AssertionError: expected:<22> but was:<23> 

Я делаю что-то не так?

ответ

6

Вы переходите от Октябрь 2004 - октябрь 2005 года. Между тем нет никакого високосного дня, поэтому день месяца по-прежнему остается 23-м. Теперь, если бы вы начали в 2003-10-23, это было бы иначе.