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



我正在开发一个我正在使用java8时间的应用程序。我正在面对一个问题。

假设时间A是08:00,时间B为17:00,因此这两次之间的差异为9H: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);
}

为什么不使用Duration类?这是针对像您这样的情况。

    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());

如果时间差出现负数,则添加24。

simples!

(显然,这会忽略过夜的日光节省时间,因此最好的选择是使用时间持续时间对象正确执行此操作。也就是说,您需要更多地了解与两次相关的日期。(

您必须计算时间差模型24。因此,请像您已经这样做一样差异,然后计算Modulo 24。请注意,在Java -16%24中将返回-16,因此您真正需要做的就是以下操作:

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

总是返回积极的结果。

检查 starttime 是否在 endtime 之后,并在需要时交换OPERNADS:

    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);
    }

最新更新