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

Jun*_*aid 2 java time localtime java-8 java-time

我正在开发一个我正在使用Java8 Time的应用程序.我正面临一个问题.

假设时间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);

}
Run Code Online (Sandbox Code Playgroud)

Ole*_*.V. 8

为什么不Duration上课?这适用于像你这样的情况.

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

    System.out.println(calculatedTime);
Run Code Online (Sandbox Code Playgroud)

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

PT8H
Run Code Online (Sandbox Code Playgroud)

要在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);
Run Code Online (Sandbox Code Playgroud)

这打印

8:00
Run Code Online (Sandbox Code Playgroud)

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

    String formattedTime = String.format("%d:%02d", 
                                         calculatedTime.toHoursPart(),
                                         calculatedTime.toMinutesPart());
Run Code Online (Sandbox Code Playgroud)


Bat*_*eba 5

如果时差出现负值,则加24.

Simples!

(显然这会忽略一夜之间对夏令时的变化,所以你最好的选择是使用持续时间对象正确地做到这一点.那就是说,你需要了解更多与两次相关的日期.)