我正在开发一个我正在使用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);
}
答案 0 :(得分:7)
为什么不使用Duration
课程?这适用于像你这样的情况。
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格式化(未测试):
String formattedTime = String.format("%d:%02d",
calculatedTime.toHoursPart(),
calculatedTime.toMinutesPart());
答案 1 :(得分:5)
如果时差出现负值,则加上24。
Simples!
(显然这会忽略隔夜夏令时的变化,所以你最好的选择是使用持续时间对象正确地做到这一点。那就是说,你需要更多地了解与两次相关的日期。 。)
答案 2 :(得分:1)
检查 startTime is after endTime ,并根据需要交换opernads:
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);
}
答案 3 :(得分:1)
您必须以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);
}
总是会返回正面结果。