gpt4 book ai didi

java - 用Java计算两个小时之间的持续时间

转载 作者:行者123 更新时间:2023-12-01 16:48:58 25 4
gpt4 key购买 nike

我想计算Java中两个小时(HH:mm:ss)之间的时差(持续时间)。在这里,我已经阅读了有关此主题的几个主题,但我的问题有点不同。

我也无法使用 Joda-Time

示例:

input values:    12:03:00 
00:00:00

expected output: 11:57:00

代码:

public static void main(String[] args) throws ParseException {

Scanner sc = new Scanner(System.in);
String startTime = sc.next();
String endTime = sc.next();

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Date d1 = sdf.parse(startTime);
Date d2 = sdf.parse(endTime);
long elapsed = d2.getTime() - d1.getTime();

String hms = String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(elapsed),
TimeUnit.MILLISECONDS.toMinutes(elapsed) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(elapsed)),
TimeUnit.MILLISECONDS.toSeconds(elapsed) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(elapsed)));

if (elapsed > 0) {
System.out.println(hms);
} else {

elapsed = elapsed * (-1); //otherwise, print hours with '-'

String hms1 = String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(elapsed),
TimeUnit.MILLISECONDS.toMinutes(elapsed) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(elapsed)),
TimeUnit.MILLISECONDS.toSeconds(elapsed) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(elapsed)));

System.out.println(hms1);
}
}

结果:

expected output: 11:57:00

actual output: 12:03:00 //that's the problem

最佳答案

tl;博士

Duration.between( 
LocalTime.parse( "12:03:00" ) ,
LocalTime.parse( "23:59:59.999999999" )
).plusNanos( 1 ).withNanos( 0 )

PT11H57M

使用纳秒

现代方法使用 java.time 类。

问题是,仅针对一天中的某个时间,没有午夜。因此,您显然打算在一天结束时使用的 00:00 实际上被解释为一天开始。

距离这一天结束只剩下最后纳秒了。 LocalTime 有一个为最后纳秒定义的常量:LocalTime.MAX = 23:59:59.999999999

由于您只关心整秒,因此我们可以利用小数秒。如果您的结束时间恰好是 00:00:00,请替换 LocalTime.MAX。然后计算Duration目的。您可以添加单个纳秒,然后通过将秒小数部分(纳秒)设置为零来截断生成的小数秒。

对于 00:00:00 以外的结束时间,数学仍然有效。添加纳秒会得到 ….000000001 秒的一小部分,并且 Duration::withNanos将截断不需要的部分。

// This code assumes the inputs are *always* in whole seconds, without any fraction-of-second.

LocalTime start = LocalTime.parse( "12:03:00" );
LocalTime stop = LocalTime.parse( "00:00:00" );

if( stop.equals( LocalTime.MIN ) ) {
stop = LocalTime.MAX ; // `23:59:59.999999999`
}

Duration d = Duration.between( start , stop );
d = d.plusNanos( 1 ).withNanos( 0 ) ;

System.out.println( "start/stop: " + start + "/" + stop );
System.out.println( "d: " + d );

查看此code run live at IdeOne.com .

PT11H57M

格式化

toString 的输出是标准的 ISO 8601 formatDuration 类可以解析并生成此类字符串。

我强烈建议不要以时间形式表示时间跨度,HH:MM:SS。这是不明确的,并且在人们阅读时常常会造成困惑。

但是如果您坚持使用该格式,则必须自己构建字符串。 Duration 类缺少其他 java.time 类中的 format 方法。奇怪的是,这个类最初缺乏提取部分的方法:天数、小时数、分钟数、秒数和秒的小数部分。请参阅this Question供讨论。 Java 9 带来了这样的方法,名为 to...Part

在使用 Java 8 时,我建议对 ISO 8601 格式的输出进行字符串操作。将 PT 替换为空字符串。如果有 M,请将 H 替换为冒号。如果有 S,则将 M 替换为冒号,并将 S 替换为空字符串。如果没有 S,则将 M 替换为空字符串。我相信您可以在 Stack Overflow 上找到此代码。

关于java - 用Java计算两个小时之间的持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44530346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com