Java中的间隔时间减法

时间:2011-06-13 20:11:35

标签: java time intervals

我试图找到Java中的时间差异(HH:mm:ss.SSS),每次可以超过24小时。 SimpleDateFormat不支持超过24小时的时间。

例如,

时间A = 36:00:00.00
时间B = 23:00:00.00

我想得到13:00 00:00的答案。 (13个小时)。

是否有人知道是否有任何可以执行减法的Java库。还想知道Java库是否可以添加时间。

5 个答案:

答案 0 :(得分:11)

您不需要第三方库

这是一个简单的数学运算,并不直接与Date DateTimeTimestamp个实例有任何关系,但似乎与interval相关, JDK> = 1.5内置了java.util.concurrent.TimeUnit的功能,可以处理这种类型的数学,而不会引入任何依赖。

以下是解析输入并将其转换为毫秒的代码,然后您可以将其转换回您想要的任何String格式,我方便地选择您请求的格式。

java.util.concurrent.TimeUnit是一个隐藏的小宝石,大多数人都不知道这种偷偷摸摸的1.5。将这个课程埋没在java.util.concurrent包中并且似乎没有人知道它是犯罪行为。

import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main
{
    private static long parseInterval(final String s)
    {
        final Pattern p = Pattern.compile("^(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3})$");
        final Matcher m = p.matcher(s);
        if (m.matches())
        {
            final long hr = Long.parseLong(m.group(1)) * TimeUnit.HOURS.toMillis(1);
            final long min = Long.parseLong(m.group(2)) * TimeUnit.MINUTES.toMillis(1);
            final long sec = Long.parseLong(m.group(3)) * TimeUnit.SECONDS.toMillis(1);
            final long ms = Long.parseLong(m.group(4));
            return hr + min + sec + ms;
        }
        else
        {
            throw new IllegalArgumentException(s + " is not a supported interval format!");
        }
    }

    private static String formatInterval(final long l)
    {
        final long hr = TimeUnit.MILLISECONDS.toHours(l);
        final long min = TimeUnit.MILLISECONDS.toMinutes(l - TimeUnit.HOURS.toMillis(hr));
        final long sec = TimeUnit.MILLISECONDS.toSeconds(l - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min));
        final long ms = TimeUnit.MILLISECONDS.toMillis(l - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min) - TimeUnit.SECONDS.toMillis(sec));
        return String.format("%02d:%02d:%02d.%03d", hr, min, sec, ms);
    }

    public static void main(final String[] args)
    {
        final String s1 = "36:00:00.000";
        final String s2 = "23:00:00.000";

        final long i1 = parseInterval(s1);
        final long i2 = parseInterval(s2);

        System.out.println(formatInterval(i1 - i2));
    }
}

输出

13:00:00.000

我假设您的最后一个数字是milliseconds,其分辨率应为3位数。

答案 1 :(得分:3)

这是使用JodaTime的完整解决方案。我敢说使用java.utiljava.util.concurrent apis来做这件事并不容易和优雅:

public static int getHoursBetween(final String date1, final String date2){
    final DateTimeFormatter fmt =
        DateTimeFormat
            .forPattern("HH:mm:ss.SS")
            .withChronology(
                LenientChronology.getInstance(
                    GregorianChronology.getInstance()));
    return Hours.hoursBetween(
        fmt.parseDateTime(date1),
        fmt.parseDateTime(date2)
    ).getHours();
}

LenientChronology确保支持38:00:00.00之类的值)

答案 2 :(得分:1)

查看Joda-Time,这是一个用Java处理时间和日期的完整库,包括间隔算术。

答案 3 :(得分:0)

尝试将时间转换为秒,减去然后转换回简单的时间格式。

答案 4 :(得分:0)

以下是如何使用Joda-TimeJim Garrison之前提到过的两个日期之间的差异的示例。它确实是可用的最佳时间库之一。

  public static void main(String[] args) {
    DateTime timeA = new DateTime(2011, 6, 13, 12, 0, 0, 0);
    DateTime timeB = new DateTime(2011, 6, 12, 23, 0, 0, 0);

    Period period = new Period(timeB, timeA);
    System.out.println(period.getHours());
  }