Java中的间隔时间减法

Pol*_*uin 5 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库是否可以添加时间.

小智 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是

13:00:00.000
Run Code Online (Sandbox Code Playgroud)

我假设您的最后一个数字milliseconds应该是3位数的分辨率.

  • @Steve Kuo,没有"太多'决赛'" (7认同)
  • @Steve不是绝对的,而是*经验的*真相. (3认同)
  • @Steve Kuo:不,这不是个人选择风格的问题.你已经读完了,你决定不理睬.除了*Jarrod Roberson*发布的精细链接中所说的内容之外,您还应该知道使用*final*作为局部变量可以帮助智能IDE(如IntelliJ IDEA)提供更加智能的警告.它还有助于避免愚蠢的分心错误.这不是风格问题,不要争论. (2认同)

Jim*_*son 1

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

  • 我想我只是不明白为什么建议第三方库是一个合适的答案,或者为什么根本需要使用第三方库。但无论如何,对每个人来说都是如此。 (4认同)
  • 因为joda-time是一个处理时间间隔的完整库。这里没有必要重新发明轮子。 (3认同)
  • @Jim,我不反对使用它。我只是不明白为什么“看看 Joda-Time”是一个答案......看起来更像是一个“伟大”的评论。 (3认同)