DateTime.plusMinutes (..) возвращает минуты -1 - PullRequest
0 голосов
/ 28 ноября 2018

Я столкнулся с проблемой при использовании JodaTime.Вот мой метод:

public double calculateTimeDifference(String startedAt) {
    DateTime cet = new DateTime(DateTimeZone.forID("CET"));

    DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss'Z'");
    DateTime convertedStartedAt = formatter.parseDateTime(startedAt);

    Period period = new Interval(cet, convertedStartedAt).toPeriod();
    int minutes = period.getMinutes();

    return minutes;
}

И у меня есть тест, который добавляет 30 минут к времени:

@Test
public void testTimeDifference() {
    DateTime testtime = new DateTime(DateTimeZone.forID("CET")).plusHours(2);
    testtime = testtime.plusMinutes(30);

    // Format for input
    DateTimeFormatter cet = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    // Parsing the date
    DateTime requestedFormat = cet.parseDateTime(testtime.toString());
    // Format for output
    DateTimeFormatter requestedTime = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss'Z'");

    double time = carService.calculateTimeDifference(requestedTime.print(requestedFormat));

    assertEquals(30, time, 0.0);
}

Но когда я запускаю это, вывод:

Expected : 30.0
Actual : 29.0

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Хорошо, я исправил это сейчас, благодаря комментарию @Benoit.Я изменил метод calculateTimeRemaining на этот:

public double calculateTimeDifference(String startedAt) {
    DateTime utc = new DateTime(DateTimeZone.forID("CET"));

    DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss'Z'");
    DateTime convertedStartedAt = formatter.parseDateTime(startedAt);

    Period period = new Period(utc, convertedStartedAt);
    double hours = period.getHours();
    double minutes = period.getMinutes();

    return hours + Math.round(minutes * 10.0/ 60)/10.0;
}

Спасибо всем вам!

0 голосов
/ 28 ноября 2018

Причина в том, что вы генерируете дважды текущую дату и время: один раз здесь:

    DateTime testtime = new DateTime(DateTimeZone.forID("CET")).plusHours(2);

и один раз здесь:

    DateTime utc = new DateTime(DateTimeZone.forID("CET"));

Таким образом, фактическая разница между ними составляет 29 минут 59 секунди 360 миллис (в моем тесте), округленные до 29 минут.

...