Java 如何避免负时差?
我正在开发一个应用程序,其中我正在使用Java8 Time。我面临一个问题 假设时间A是08:00,时间B是17:00,所以这两个时间之间的差是9小时,在我的例子中这是正确的,但是如果时间A是18:00,时间B是02:00,它应该是8小时,但是在我的例子中,我的程序返回-16。请有人指导我如何解决这个问题 我的代码:Java 如何避免负时差?,java,time,java-8,java-time,localtime,Java,Time,Java 8,Java Time,Localtime,我正在开发一个应用程序,其中我正在使用Java8 Time。我面临一个问题 假设时间A是08:00,时间B是17:00,所以这两个时间之间的差是9小时,在我的例子中这是正确的,但是如果时间A是18:00,时间B是02:00,它应该是8小时,但是在我的例子中,我的程序返回-16。请有人指导我如何解决这个问题 我的代码: @Test public void testTime() { DateTimeFormatter format = DateTimeFormatter.ofPattern(
@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 傻瓜
(显然,这将忽略夏时制的夜间更改,因此您最好的选择是正确地使用time duration对象来执行此操作。尽管如此,您还需要进一步了解与这两个时间相关的日期。)检查开始时间是否为结束时间,必要时交换操作:
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将返回-16
,因此您真正需要做的是:
public static int modulus(int n, int m){
return (n < 0) ? (m - (Math.abs(n) % m) ) %m : (n % m);
}
公共静态整数模(整数n,整数m){
返回值(n<0)?(m-(数学绝对值(n)%m))%m:(n%m);
}
它总是返回一个积极的结果。为什么不使用
持续时间
类?这是为你这样的情况准备的
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格式化(未测试):
使用
Math.abs
?差分计算是正确的,实际上,我想说的是如何使用它的问题。单独使用时间的价值微乎其微,仅就LocalTime
而言,在18:00和2:00之间有-16个小时是正确的。您需要的是一个正确设置了LocalDateTime
的LocalDateTime
实例,然后您可以进行正确的计算。@M.Prokhorov请将答案放在答案部分。Math.abs没有帮助,OP正在使用strings@ErwinBolwidt使用Math.abs是错误的。他需要模24运算,结果在0到23之间。示例:从23:00到02:00经过的时间为-21小时或3小时,但肯定不是21小时。@ΦXocę웃Пepeúpaツ 阅读:“如果时差为负值”。既不是02:00负,也不是OPs示例中的差异。你知道吗?为什么不加上24,然后计算模24的结果呢?在这种情况下,加24就可以了。但这个函数更一般。想象一下,有一个像-251
这样的数字,加上24不会变成正数。
String formattedTime = String.format("%d:%02d",
calculatedTime.toHoursPart(),
calculatedTime.toMinutesPart());