首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的间隔时间减法

问Java中的间隔时间减法
EN

Stack Overflow用户
提问于 2011-06-14 04:11:35
回答 5查看 8.5K关注 0票数 5

我试着找出Java语言中的时间差(HH:mm:ss.SSS),在Java语言中,每个时间可以超过24小时。SimpleDateFormat不支持大于24小时的时间。

例如,

时间A= 36:00:00.00

时间B= 23:00:00.00

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

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

EN

回答 5

Stack Overflow用户

发布于 2011-06-14 04:38:36

你不需要第三方库

这是简单的数学运算,看起来与Date DateTime或Timestamp实例没有任何直接关系,但看起来确实与interval相关,并且具有java.util.concurrent.TimeUnit的JDK >= 1.5中内置的功能可以在不引入任何依赖项的情况下处理这种类型的数学运算。

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

java.util.concurrent.TimeUnit是一个隐藏的小宝石,大多数人不知道它是如何偷偷进入1.5的。这个类被埋没在java.util.concurrent包中,似乎没有人知道它,这是一种犯罪。

代码语言:javascript
复制
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));
    }
}

输出为

代码语言:javascript
复制
13:00:00.000

我假设你的意思是最后一个数字是milliseconds,它应该有3位数字的分辨率。

票数 11
EN

Stack Overflow用户

发布于 2011-06-14 06:01:30

这是一个使用JodaTime的完整解决方案。我敢说,使用java.util或java.util.concurrent apis没有比这更简单、更优雅的方法来实现这一点:

代码语言:javascript
复制
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这样的值)

票数 3
EN

Stack Overflow用户

发布于 2011-06-14 04:13:21

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6335764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档