Java代码查找两个时间之间的差异,其中时间以日期类型存储,时间以24小时格式存储

Java代码查找两个时间之间的差异,其中时间以日期类型存储,时间以24小时格式存储,java,time,datetime-format,Java,Time,Datetime 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 d

我需要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部分。

使用日期的问题是,即使您只使用了日期的时间部分,它仍然需要实际日期,因此如果您只是发送时间,它将不正确

而是使用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;
}
这将在几分钟内产生差异:

08:30

更新2

下面是一个返回持续时间的更干净的方法

使用Date的问题是,即使您只使用了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;
}
这将在几分钟内产生差异:

08:30

更新2

下面是一个返回持续时间的更干净的方法


虽然强烈建议您使用更为最新的Java时间库,如LocalTime,但到目前为止,您的逻辑实际上是正确的,但有一点需要注意:

SimpleDateFormat readFormat = new SimpleDateFormat("HH:mm");
Date d1 = readFormat.parse(txtshiftIn);
Date d2 = readFormat.parse(txtshiftOut);
long diff = d2.getTime() - d1.getTime();
在你的代码中,如果d1在d2之后,你将得到一个长时间差的负结果

所以当你说

但现在输出是16小时

实际输出为-16小时

当然,在你的情况下,减去16小时没有多大意义,但是你可以很容易地解决这个问题,只要简单地增加24小时,以防差分的结果为负,-16+24是你预期的8

因此,只需在您发布的代码末尾添加以下行

if(diff < 0) {
    diff = 86400000 + diff;
} 
你会得到你期望的结果!
86400000是以毫秒表示的24小时

,强烈建议您使用更为更新的Java时间库,如LocalTime。到目前为止,您的逻辑实际上是正确的,但有一点需要注意:

SimpleDateFormat readFormat = new SimpleDateFormat("HH:mm");
Date d1 = readFormat.parse(txtshiftIn);
Date d2 = readFormat.parse(txtshiftOut);
long diff = d2.getTime() - d1.getTime();
在你的代码中,如果d1在d2之后,你将得到一个长时间差的负结果

所以当你说

但现在输出是16小时

实际输出为-16小时

当然,在你的情况下,减去16小时没有多大意义,但是你可以很容易地解决这个问题,只要简单地增加24小时,以防差分的结果为负,-16+24是你预期的8

因此,只需在您发布的代码末尾添加以下行

if(diff < 0) {
    diff = 86400000 + diff;
} 
你会得到你期望的结果!
86400000是以毫秒为单位的24小时

@Govinda Sakhare String txtshiftIn=request.getParametershiftIn;所以时间会扩展两个不同的天,而不是同一天的一部分?是的,时间会扩展两个不同的天,而不是同一天的一部分。我建议您不要使用SimpleDateFormat和Date。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。而是使用LocalTime和DateTimeFormatter,两者都来自@Govinda Sakhare String txtshiftIn=request.getParametershiftIn;所以时间会扩展两个不同的天,而不是同一天的一部分?是的,时间会扩展两个不同的天,而不是同一天的一部分。我建议您不要使用SimpleDateFormat和Date。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。改为使用LocalTime和DateTimeFormatter,两者都来自。预期输出为8,但上面代码的输出为-16固定答案,以适应天数的差异。太好了。您可以使用lt2.isBeforelt1来提高可读性您甚至可以在不使用格式化程序的情况下进行解析,只使用LocalTime.parsetxtshiftIn和同样的移位时间。但是当我执行代码以查找20:00到4:30之间的时间时,它给出了9小时,预期输出为8小时30分钟预期输出为8,但是上面代码的输出是-16固定答案,以适应天数的差异。太好了。您可以使用lt2.isBeforelt1来提高可读性您甚至可以在不使用格式化程序的情况下进行解析,只使用LocalTime.parsetxtshiftIn和相同的移位时间。但是当我执行代码以查找20:00到4:30之间的时间时,它给出了9小时,预期的输出是8小时30分钟