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

问题描述 投票:1回答:2

我发现使用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

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

java duration localtime
2个回答
1
投票

请记住,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,这就像从较小的数字中减去一个更大的数字,你得到一个负数。


0
投票

返回的Duration区间有数据,StartTime是否发生在EndTime之后,可以用于进一步处理;像这样

     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);
© www.soinside.com 2019 - 2024. All rights reserved.