Java减去2时长,单位为HH:MM:SS
我有两个java字符串(HH:MM:SS),请注意这不是时间,而是持续时间,我使用结束时间-开始时间来获取这些值: 案例1: 持续时间1=“12:04:45” 持续时间2=“13:04:45” 预期结果:持续时间1-持续时间2=“-1:00:00”(注意有负数) 案例2: 持续时间1=“15:13:32” 持续时间2=“12:04:45” 预期结果:持续时间1-持续时间2=“3:08:47” 我该怎么做?我对案例1的尝试(代码修改自):Java减去2时长,单位为HH:MM:SS,java,date,Java,Date,我有两个java字符串(HH:MM:SS),请注意这不是时间,而是持续时间,我使用结束时间-开始时间来获取这些值: 案例1: 持续时间1=“12:04:45” 持续时间2=“13:04:45” 预期结果:持续时间1-持续时间2=“-1:00:00”(注意有负数) 案例2: 持续时间1=“15:13:32” 持续时间2=“12:04:45” 预期结果:持续时间1-持续时间2=“3:08:47” 我该怎么做?我对案例1的尝试(代码修改自): 有了Java time API,您可以使用持续时间来计算持
有了Java time API,您可以使用
持续时间
来计算持续时间,并根据需要对其进行格式化:
String s1 = "12:04:45";
String s2 = "13:04:45";
LocalTime t1 = LocalTime.parse(s1);
LocalTime t2 = LocalTime.parse(s2);
Duration d = Duration.between(t2, t1);
System.out.println(d); //PT-1H
如果要将其打印为-1:00:00
,则需要调整输出格式。它可能是这样的:
private static String toHHMMSS(Duration d) {
long hours = d.toHours();
int minutes = (int) (d.toMinutes() % 60);
int secs = (int) (d.getSeconds() % 60);
return hours + ":" + minutes + ":" + secs;
}
用于计算时间差。您可以将每个字段和/或格式查询为时间字符串,如下例所示:
private Calendar getTimeDiffDate(Date d1, Date d2) {
Calendar c = Calendar.getInstance();
c.setTime(new Date(d1.getTime()-d2.getTime()));
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
// Format as a time string:
String formattedTime = formatter.format(c.getTime());
System.out.println("formattedTime: "+formattedTime);
// Query by each field:
System.out.println("Hours: "+c.get(Calendar.HOUR));
System.out.println("Minutes: "+c.get(Calendar.MINUTE));
System.out.println("Seconds: "+c.get(Calendar.SECOND));
return c;
}
如果你的经期超过24小时,使用一些人建议的本地时间或日期计算是不起作用的,因为这不适合一天 如果没有Java8,可以使用JodaTime。我刚刚检查了这段代码是否也适用于JodaTime1.6.2,这是最后一个仍然适用于JDK1.4.2的版本
PeriodFormatter formatter = new PeriodFormatterBuilder()
.printZeroAlways().minimumPrintedDigits(2)
.appendHours().appendSuffix(":").appendMinutes().appendSuffix(":").appendSeconds()
.toFormatter();
Period period1 = formatter.parsePeriod("12:04:45");
Period period2 = formatter.parsePeriod("13:04:45");
Period difference1 = period1.minus(period2).normalizedStandard();
System.out.println(formatter.print(difference1));
Period period3 = formatter.parsePeriod("15:13:32");
Period period4 = formatter.parsePeriod("12:04:45");
Period difference2 = period3.minus(period4).normalizedStandard();
System.out.println(formatter.print(difference2));
输出:
-01:00:00
03:08:47
JodaTime:
- 版本1.6.2来源:
- 版本1.6.2 Maven Jar工件:
-1
点钟。您可以通过将字符串s拆分为:
并减去解析后的整数来手动执行此操作。@user3172596但这不是时间,而是持续时间。此api在JDK 1.4中可用吗?似乎不是,只是因为Java 8date1=12:04:45,date2=13:04:45,date1-date2=11小时使用您的方法,date1=12:04:45,date2=13:04:45我有一个小时的时间使用新的SimpleDataFormat(“kk:mm:ss”),看看我是否可以使用这个库来获取Java版本“1.4.2”以及更高版本的JodaTime 2.0,您需要JDK 1.5或更高版本。我不认为Period类在1.6.2(JDK1.4的最新版本)中,但我会check@user3172596我刚刚检查过,但这也适用于1.6.2,因此您可以将其用于JDK1.4.2正确答案,Joda Time总是比使用旧的麻烦的日期时间类更好。还有一个建议:使用问题的格式,而不是一天中容易与时间混淆的问题格式。Joda Time默认使用标准格式解析和生成字符串表示。格式为PnYnMnDTnHnMnS
其中P
标记开始,并且T
将年-月-日部分与时-分-秒分开。例如:PT3H8M47S
@Erwin Bolwidt谢谢!顺便说一句,如果持续时间1是12:03:32,持续时间是12:04:39,使用持续时间1-持续时间2将得到00:-01:-07,joda是否有任何格式,以便我可以显示-00:01:07?
-01:00:00
03:08:47