Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java减去2时长,单位为HH:MM:SS_Java_Date - Fatal编程技术网

Java减去2时长,单位为HH:MM:SS

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字符串(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,您可以使用
持续时间
来计算持续时间,并根据需要对其进行格式化:

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