从一天到另一天的Java持续时间错误
我发现了一个使用Java Duration的非常简单的问题从一天到另一天的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
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之间的差值。