如何避免时差之间的负时间?
How to avoid negative time between time difference?
我正在开发一个应用程序,我在其中使用 Java8 时间。我遇到了问题。
假设时间 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);
}
如果时间差为负数,则加 24。
简单!
(显然,这会忽略夜间对夏令时的更改,因此您最好的选择确实是使用持续时间对象正确执行此操作。尽管如此,您随后需要了解更多关于与两次。)
检查 startTime is after endTime 并根据需要交换操作数:
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);
}
您必须计算时差模 24
。
所以像你已经做的那样取差,然后计算它模 24
。请注意,在 Java -16%24
中会 return -16
所以您真正需要做的是:
public static int modulus(int n, int m){
return (n < 0) ? (m - (Math.abs(n) % m) ) %m : (n % m);
}
总是 return 一个积极的结果。
为什么不使用Duration
class?它适用于像您这样的情况。
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());
我正在开发一个应用程序,我在其中使用 Java8 时间。我遇到了问题。
假设时间 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);
}
如果时间差为负数,则加 24。
简单!
(显然,这会忽略夜间对夏令时的更改,因此您最好的选择确实是使用持续时间对象正确执行此操作。尽管如此,您随后需要了解更多关于与两次。)
检查 startTime is after endTime 并根据需要交换操作数:
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);
}
您必须计算时差模 24
。
所以像你已经做的那样取差,然后计算它模 24
。请注意,在 Java -16%24
中会 return -16
所以您真正需要做的是:
public static int modulus(int n, int m){
return (n < 0) ? (m - (Math.abs(n) % m) ) %m : (n % m);
}
总是 return 一个积极的结果。
为什么不使用Duration
class?它适用于像您这样的情况。
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());