Java 查找两个时间差异的代码,其中时间以日期类型存储,时间以 24 小时格式存储
Java code to find difference between two time,where time is stored in date type and time is in 24 hour format
我需要 java 代码来找出 24 小时格式的两个时间之间的差异
例如:
20:00:00 - 04:00:00
预期输出为 8 小时
但现在输出是 16 小时
当我尝试 12 小时格式输出时 4.
下面是用于解析和查找差异的代码
SimpleDateFormat readFormat = new SimpleDateFormat("HH:mm");
Date d1 = readFormat.parse(txtshiftIn);
Date d2 = readFormat.parse(txtshiftOut);
long diff = d2.getTime() - d1.getTime();
输入只是 20:00 和 04:00 没有秒和 AM/PM 部分。
使用 Date
的问题是它仍然需要一个实际日期,即使您只使用它的时间部分,所以如果您只是发送它的时间,它是不正确的。
而是使用 LocalTime
和 ChronoUnit.HOURS
来获得时间之间的差异。
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");
LocalTime lt1 = LocalTime.parse(txtshiftIn, dtf);
LocalTime lt2 = LocalTime.parse(txtshiftOut, dtf);
long diff = ChronoUnit.HOURS.between(lt1, lt2);
这将显示 -16
,这意味着 lt1
领先于 lt2
,这表明 lt2
是第二天,因此我们可以修改它以获得差异这样
if (diff < 0) {
diff += 24;
}
这将为您提供预期的 8
小时差。
更新
要计算分钟数的差异,您可以执行以下操作:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");
LocalTime lt1 = LocalTime.parse(txtshiftIn, dtf);
LocalTime lt2 = LocalTime.parse(txtshiftOut, dtf);
long diff = ChronoUnit.MINUTES.between(lt1, lt2); //get diff in minutes
if (lt2.isBefore(lt1)) {
diff += TimeUnit.DAYS.toMinutes(1); //add a day to account for day diff
}
long hours = diff / 60;
long minutes = diff % 60;
LocalTime newTime = LocalTime.parse(String.format("%02d:%02d", hours, minutes), dtf); //Format the difference to be converted to LocalTime
System.out.println(newTime);
这将产生分钟数的差异:
08:30
更新 2
这是一个更简洁的方法 returns Duration
public Duration timeDifference(String txtshiftIn, String txtshiftOut) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");
LocalTime lt1 = LocalTime.parse(txtshiftIn, dtf);
LocalTime lt2 = LocalTime.parse(txtshiftOut, dtf);
Duration between = Duration.between(lt1, lt2);
if (lt2.isBefore(lt1)) { //account for lt2 being on the next day
between = Duration.ofMinutes(TimeUnit.DAYS.toMinutes(1)).plus(between);
}
return between;
}
虽然强烈建议您使用像 LocalTime 这样的更新的 Java 时间库,但您的逻辑到目前为止实际上是正确的,但有一点需要注意:
SimpleDateFormat readFormat = new SimpleDateFormat("HH:mm");
Date d1 = readFormat.parse(txtshiftIn);
Date d2 = readFormat.parse(txtshiftOut);
long diff = d2.getTime() - d1.getTime();
在您的代码中,如果 d1 在 d2 之后,您将得到 long diff
的否定结果
所以当你说
"but now output is 16 hrs"
实际产量是-16小时
当然,减去 16 小时对你的情况没有多大意义,但你可以通过简单的技巧轻松解决这个问题,即在 diff 出现负面结果的情况下只需添加 24 小时。 (-16+24 是您预期的结果 8)。
因此只需在您发布的代码末尾添加以下行
if(diff < 0) {
diff = 86400000 + diff;
}
你会得到你期望的结果!
(86400000是以毫秒表示的24h)
我需要 java 代码来找出 24 小时格式的两个时间之间的差异 例如: 20:00:00 - 04:00:00
预期输出为 8 小时 但现在输出是 16 小时 当我尝试 12 小时格式输出时 4.
下面是用于解析和查找差异的代码
SimpleDateFormat readFormat = new SimpleDateFormat("HH:mm");
Date d1 = readFormat.parse(txtshiftIn);
Date d2 = readFormat.parse(txtshiftOut);
long diff = d2.getTime() - d1.getTime();
输入只是 20:00 和 04:00 没有秒和 AM/PM 部分。
使用 Date
的问题是它仍然需要一个实际日期,即使您只使用它的时间部分,所以如果您只是发送它的时间,它是不正确的。
而是使用 LocalTime
和 ChronoUnit.HOURS
来获得时间之间的差异。
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");
LocalTime lt1 = LocalTime.parse(txtshiftIn, dtf);
LocalTime lt2 = LocalTime.parse(txtshiftOut, dtf);
long diff = ChronoUnit.HOURS.between(lt1, lt2);
这将显示 -16
,这意味着 lt1
领先于 lt2
,这表明 lt2
是第二天,因此我们可以修改它以获得差异这样
if (diff < 0) {
diff += 24;
}
这将为您提供预期的 8
小时差。
更新 要计算分钟数的差异,您可以执行以下操作:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");
LocalTime lt1 = LocalTime.parse(txtshiftIn, dtf);
LocalTime lt2 = LocalTime.parse(txtshiftOut, dtf);
long diff = ChronoUnit.MINUTES.between(lt1, lt2); //get diff in minutes
if (lt2.isBefore(lt1)) {
diff += TimeUnit.DAYS.toMinutes(1); //add a day to account for day diff
}
long hours = diff / 60;
long minutes = diff % 60;
LocalTime newTime = LocalTime.parse(String.format("%02d:%02d", hours, minutes), dtf); //Format the difference to be converted to LocalTime
System.out.println(newTime);
这将产生分钟数的差异:
08:30
更新 2
这是一个更简洁的方法 returns Duration
public Duration timeDifference(String txtshiftIn, String txtshiftOut) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");
LocalTime lt1 = LocalTime.parse(txtshiftIn, dtf);
LocalTime lt2 = LocalTime.parse(txtshiftOut, dtf);
Duration between = Duration.between(lt1, lt2);
if (lt2.isBefore(lt1)) { //account for lt2 being on the next day
between = Duration.ofMinutes(TimeUnit.DAYS.toMinutes(1)).plus(between);
}
return between;
}
虽然强烈建议您使用像 LocalTime 这样的更新的 Java 时间库,但您的逻辑到目前为止实际上是正确的,但有一点需要注意:
SimpleDateFormat readFormat = new SimpleDateFormat("HH:mm");
Date d1 = readFormat.parse(txtshiftIn);
Date d2 = readFormat.parse(txtshiftOut);
long diff = d2.getTime() - d1.getTime();
在您的代码中,如果 d1 在 d2 之后,您将得到 long diff
所以当你说
"but now output is 16 hrs"
实际产量是-16小时
当然,减去 16 小时对你的情况没有多大意义,但你可以通过简单的技巧轻松解决这个问题,即在 diff 出现负面结果的情况下只需添加 24 小时。 (-16+24 是您预期的结果 8)。
因此只需在您发布的代码末尾添加以下行
if(diff < 0) {
diff = 86400000 + diff;
}
你会得到你期望的结果! (86400000是以毫秒表示的24h)