DateTime.plusMinutes(..) return 分钟 -1

DateTime.plusMinutes(..) return minutes -1

我在使用 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

原因是您生成了两次当前日期和时间: 曾经在这里:

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

曾经在这里:

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

所以两者之间的实际差异是 29 分 59 秒和 360 毫秒(在我的测试中),四舍五入为 29 分钟。

好的,感谢@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;
}

谢谢大家!