Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从一天到另一天的Java持续时间错误_Java_Duration_Localtime - Fatal编程技术网

从一天到另一天的Java持续时间错误

从一天到另一天的Java持续时间错误,java,duration,localtime,Java,Duration,Localtime,我发现了一个使用Java Duration的非常简单的问题 LocalTime SaturdayStart = LocalTime.of(22, 30); LocalTime SaturdayEnd = LocalTime.of(01, 00); System.out.println(SaturdayStart); System.out.println(SaturdayEnd); System.out.println(Duration.betw

我发现了一个使用Java Duration的非常简单的问题

     LocalTime SaturdayStart = LocalTime.of(22, 30); 
     LocalTime SaturdayEnd = LocalTime.of(01, 00);
     System.out.println(SaturdayStart);
     System.out.println(SaturdayEnd);
     System.out.println(Duration.between(SaturdayStart, SaturdayEnd));
此代码的输出为:

22:30
01:00
PT-21H-30M

这就是问题所在。而不是21小时,我希望持续时间是2-30米。是什么导致该方法无法看到两次之间的“日变化”

记住,
LocalTime
只表示一天中的一个时间,没有时区

因为它代表一天中你在时钟上看到的时间,所以你不能用它来计算今天22:30和第二天01:00之间的差异。您的两个
LocalTime
对象分别代表今天的22:30和01:00

要考虑当天,您需要一个
LocalDateTime
。这不仅表示时间(无时区),还表示ISO-8601日历系统中的日期。您可以像这样创建两个
LocalDateTime
对象:

LocalDateTime start = LocalDateTime.of(LocalDate.now(), LocalTime.of(22, 30));
LocalDateTime end = start.plusDays(1).withHour(1).withMinute(0);
然后您可以获得持续时间:

Duration d = Duration.between(start, end);
System.out.println(d);

顺便说一下,您在错误输出中得到的
-
字符不是不同组件的分隔符。它们是消极的迹象。这是因为您从01:00减去22:30,就像从较小的数字中减去较大的数字,您得到的是负数。

返回的
持续时间
间隔有数据,无论
开始时间
是否发生在
结束时间
之后,都可以用于进一步处理;像这样

     LocalTime SaturdayStart = LocalTime.of(22, 30); 
     LocalTime SaturdayEnd = LocalTime.of(01, 00);
     System.out.println(SaturdayStart);
     System.out.println(SaturdayEnd);
     Duration interval = Duration.between(SaturdayStart, SaturdayEnd);
     interval = interval.isNegative() ? interval.plusDays(1) : interval;
     System.out.println(interval);
以PT-21H-30M为模型,表示持续时间为
21
小时和
30
分钟,减号表示结束时间早于开始时间。因此,除非您考虑日期与时间,并且表示日期、时间的类型是“代码> LoalDATeTime< /Cord>”,否则无法获得所需的内容。您可以选择任何日期并将其与时间组合,以获得
LocalDateTime

对于任何给定的日期,如果开始时间在结束时间之后,请将结束日期时间重置为午夜,然后添加一天,最后将其时间设置为结束时间

一旦有了持续时间,就可以通过从中获取小时、分钟、秒等来创建格式化字符串。在Java-9中,引入了一些更方便的方法,使其更简单

演示:

import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class Main {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        LocalTime startTime = LocalTime.of(22, 30);
        LocalTime endTime = LocalTime.of(01, 00);

        LocalDateTime startDateTime = today.atTime(startTime);
        LocalDateTime endDateTime = today.atTime(endTime);

        if (startDateTime.isAfter(endDateTime)) {
            endDateTime = endDateTime.with(LocalTime.MIN).plusDays(1).with(endTime);
        }

        Duration duration = Duration.between(startDateTime, endDateTime);
        // Default format
        System.out.println(duration);

        // Custom format
        // ####################################Java-8####################################
        String formattedDuration = String.format("%dH-%dM-%dS", duration.toHours(), duration.toMinutes() % 60,
                duration.toSeconds() % 60);
        System.out.println(formattedDuration);
        // ##############################################################################

        // ####################################Java-9####################################
        formattedDuration = String.format("%dH-%dM-%dS", duration.toHoursPart(), duration.toMinutesPart(),
                duration.toSecondsPart());
        System.out.println(formattedDuration);
        // ##############################################################################
    }
}
PT2H30M
2H-30M-0S
2H-30M-0S
输出:

import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class Main {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        LocalTime startTime = LocalTime.of(22, 30);
        LocalTime endTime = LocalTime.of(01, 00);

        LocalDateTime startDateTime = today.atTime(startTime);
        LocalDateTime endDateTime = today.atTime(endTime);

        if (startDateTime.isAfter(endDateTime)) {
            endDateTime = endDateTime.with(LocalTime.MIN).plusDays(1).with(endTime);
        }

        Duration duration = Duration.between(startDateTime, endDateTime);
        // Default format
        System.out.println(duration);

        // Custom format
        // ####################################Java-8####################################
        String formattedDuration = String.format("%dH-%dM-%dS", duration.toHours(), duration.toMinutes() % 60,
                duration.toSeconds() % 60);
        System.out.println(formattedDuration);
        // ##############################################################################

        // ####################################Java-9####################################
        formattedDuration = String.format("%dH-%dM-%dS", duration.toHoursPart(), duration.toMinutesPart(),
                duration.toSecondsPart());
        System.out.println(formattedDuration);
        // ##############################################################################
    }
}
PT2H30M
2H-30M-0S
2H-30M-0S

LocalTime
没有日期,这就是为什么它的名字中只有“time”。在LocalTime的上下文中根本不存在类似日期更改的内容。可能您正在查找
LocalDateTime
。它不返回21H,而是减去21H,这是22:30和01:00之间的差值。