Java 如何避免负时差?

Java 如何避免负时差?,java,time,java-8,java-time,localtime,Java,Time,Java 8,Java Time,Localtime,我正在开发一个应用程序,其中我正在使用Java8 Time。我面临一个问题 假设时间A是08:00,时间B是17:00,所以这两个时间之间的差是9小时,在我的例子中这是正确的,但是如果时间A是18:00,时间B是02:00,它应该是8小时,但是在我的例子中,我的程序返回-16。请有人指导我如何解决这个问题 我的代码: @Test public void testTime() { DateTimeFormatter format = DateTimeFormatter.ofPattern(

我正在开发一个应用程序,其中我正在使用Java8 Time。我面临一个问题

假设时间A是08:00,时间B是17:00,所以这两个时间之间的差是9小时,在我的例子中这是正确的,但是如果时间A是18:00,时间B是02:00,它应该是8小时,但是在我的例子中,我的程序返回-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

傻瓜


(显然,这将忽略夏时制的夜间更改,因此您最好的选择是正确地使用time duration对象来执行此操作。尽管如此,您还需要进一步了解与这两个时间相关的日期。)

检查开始时间是否为结束时间,必要时交换操作:

    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将返回
-16
,因此您真正需要做的是:

public static int modulus(int n, int m){
    return  (n < 0) ? (m - (Math.abs(n) % m) ) %m : (n % m);
}
公共静态整数模(整数n,整数m){
返回值(n<0)?(m-(数学绝对值(n)%m))%m:(n%m);
}

它总是返回一个积极的结果。

为什么不使用
持续时间
类?这是为你这样的情况准备的

    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格式化(未测试):


使用
Math.abs
?差分计算是正确的,实际上,我想说的是如何使用它的问题。单独使用时间的价值微乎其微,仅就
LocalTime
而言,在18:00和2:00之间有-16个小时是正确的。您需要的是一个正确设置了
LocalDateTime
LocalDateTime
实例,然后您可以进行正确的计算。@M.Prokhorov请将答案放在答案部分。Math.abs没有帮助,OP正在使用strings@ErwinBolwidt使用Math.abs是错误的。他需要模24运算,结果在0到23之间。示例:从23:00到02:00经过的时间为-21小时或3小时,但肯定不是21小时。@ΦXocę웃Пepeúpaツ 阅读:“如果时差为负值”。既不是02:00负,也不是OPs示例中的差异。你知道吗?为什么不加上24,然后计算模24的结果呢?在这种情况下,加24就可以了。但这个函数更一般。想象一下,有一个像
-251
这样的数字,加上24不会变成正数。
    String formattedTime = String.format("%d:%02d", 
                                         calculatedTime.toHoursPart(),
                                         calculatedTime.toMinutesPart());