如何避免时差之间的负时间?

How to avoid negative time between time difference?

我正在开发一个应用程序,我在其中使用 Java8 时间。我遇到了问题。

假设时间 A 是 08:00,时间 B 是 17:00,那么这两个时间之间的差异将是 9h,这在我的例子中是正确的,但是如果时间 A 是 18:00 和时间 B 是 02:00 它应该是 8h,但在我的例子中我的程序返回 -16。请有人指导我如何解决这个问题。

我的代码:

@Test
public void testTime()
{
    DateTimeFormatter format = DateTimeFormatter.ofPattern("HH:mm");

    String s = "18:00";
    String e = "02:00";

    // Parse datetime string to java.time.LocalDateTime instance
    LocalTime startTime = LocalTime.parse(s, format);
    LocalTime endTime = LocalTime.parse(e, format);

    String calculatedTime = ChronoUnit.HOURS.between(startTime, endTime)%24 + ":"
            + ChronoUnit.MINUTES.between(startTime, endTime)%60;

    System.out.println(calculatedTime);

}

如果时间差为负数,则加 24。

简单!

(显然,这会忽略夜间对夏令时的更改,因此您最好的选择确实是使用持续时间对象正确执行此操作。尽管如此,您随后需要了解更多关于与两次。)

检查 startTime is after endTime 并根据需要交换操作数:

    LocalTime startTime = LocalTime.parse(s, format);
    LocalTime endTime = LocalTime.parse(e, format);
    String calculatedTimeMorning;

    if (startTime.isAfter(endTime)) {
        calculatedTimeMorning = (ChronoUnit.HOURS.between(endTime, startTime) % 24) + ":"
                + (ChronoUnit.MINUTES.between(endTime, startTime) % 60);
    } else {
        calculatedTimeMorning = (ChronoUnit.HOURS.between(startTime, endTime) % 24) + ":"
                + (ChronoUnit.MINUTES.between(startTime, endTime) % 60);
    }

您必须计算时差模 24。 所以像你已经做的那样取差,然后计算它模 24。请注意,在 Java -16%24 中会 return -16 所以您真正需要做的是:

public static int modulus(int n, int m){
    return  (n < 0) ? (m - (Math.abs(n) % m) ) %m : (n % m);
}

总是 return 一个积极的结果。

为什么不使用Duration class?它适用于像您这样的情况。

    Duration calculatedTime = Duration.between(startTime, endTime);
    if (calculatedTime.isNegative()) {
        calculatedTime = calculatedTime.plusDays(1);
    }

    System.out.println(calculatedTime);

这会以 ISO 8601 格式打印持续时间:

PT8H

将其格式化为Java 8:

    long hours = calculatedTime.toHours();
    calculatedTime = calculatedTime.minusHours(hours);
    String formattedTime = String.format(Locale.getDefault(), "%d:%02d",
                                         hours, calculatedTime.toMinutes());
    System.out.println(formattedTime);

这会打印

8:00

要在 Java 9 中格式化(未测试):

    String formattedTime = String.format("%d:%02d", 
                                         calculatedTime.toHoursPart(),
                                         calculatedTime.toMinutesPart());