Java中的间隔时间减法

Java中的间隔时间减法,java,time,intervals,Java,Time,Intervals,我试图在Java中找到时间上的差异(HH:mm:ss.SSS),在Java中,每个时间可以超过24小时SimpleDataFormat不支持大于24小时的时间 比如说, 时间A=36:00:00.00 时间B=23:00:00.00 我想得到13:00:00.00的答案。(13小时) 有人知道是否有Java库可以执行减法吗。还想知道Java库是否可以添加时间。看看,这是一个完整的库,用于处理Java中的时间和日期,包括间隔算术。尝试将时间转换为秒,减去,然后转换回简单的时间格式。您不需要第三方库

我试图在Java中找到时间上的差异(HH:mm:ss.SSS),在Java中,每个时间可以超过24小时<代码>SimpleDataFormat不支持大于24小时的时间

比如说,

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

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


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

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

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

您不需要第三方库

这是一个简单的数学问题,似乎与
日期
日期时间
时间戳
实例没有直接关系,但似乎与
间隔
相关,JDK>=1.5中内置了
java.util.concurrent.TimeUnit
功能,可以处理这种类型的数学,而不引入任何依赖项

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

是一个隐藏的小宝石,大多数人都不知道它是如何潜入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

我想你的意思是最后一个数字是
毫秒
,它的分辨率应该是3位。

下面是一个示例,说明如何使用(前面提到过的)获得两个日期之间的差异。它确实是可用的最佳时间库之一

  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());
  }

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

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();
}


(确保支持像38:00:00.00这样的值)

你的意思是,“36:00:00.00”和“23:00:00.00”作为字符串提供,必须进行解析吗?
36:00:00.00
不是有效时间,它最多是一个时间间隔,表示方式与公共时间相同。啊,我喜欢从11:00左右开始计算时间(当我醒来时)到28:30(我睡觉时).嗨,T-Bull,是的。它们是需要解析的字符串。嗨,Jarrod Roberson,你是对的。但这是我的问题,我打算解决它。因为joda time是一个处理时间间隔的完整库。没有必要在这里重新发明轮子。我想我只是不明白为什么建议第三方库是一个合适的ans是的,或者为什么需要使用第三方库。但不管怎样,每个人都有自己的。@leonbloy:对于任何严肃的事情(或者真正关于时间/日历,而不仅仅是绝对时差),当然,但是在进行时间测量时,你会导入Joda时间吗?(例如:开始=系统。纳秒();…结束=系统。纳秒();时间=??).特别是我甚至不知道Joda Time会用“28:00:00”这样的东西做什么-这不是任何想象中的有效时间(或者我们在这里谈论的是土星时间?;)@Jim,我不反对使用它。我只是不明白为什么“看看Joda Time”是一个答案……看起来更像是一个“很棒”的评论。-1:我看不到Joda Time API中有任何东西能跳出来解决海报问题,因为他并不是真的在处理Joda Time定义的
时间
。请指出相关的Joda时间API's@Steve郭,没有“太多的<代码>最终”这样的事情。@Steve Kuo-@Steve Kuo:不,这不是个人风格选择的问题。你已经得到了你决定忽略的阅读。除了Jarrod Roberson发布的精细链接中所说的之外,您还应该知道,对局部变量使用final有助于智能IDE(如IntelliJ IDEA)提供更智能的警告。这也有助于避免愚蠢的分心错误。这不是风格的问题,别再争论了。@Steve不是绝对的,而是经验主义的真理。+1贾罗德·罗伯森。这是我第一次遇到时间单位!请让我先试用一下你的代码,然后再点击其他任何东西+1,用于实际显示Joda时间库在这种情况下的使用方式。问题不是关于日期,而是关于格式化为普通时间格式字符串的间隔。36:00:00.00代表什么?嗨,巴马纳,我不是在减去日期,而是在减去时间。如您所见,字符串“36:00:00.00”有一个时间组件,但没有日期组件。因此,Jarrod Roberson是对的。嗨,mre,Joda时间库将适用于巴马纳提出的方案。但对我的案子不起作用。不过,反馈很好。嗨,迈克五,我已经把它转换成毫秒,减法,再转换回简单的时间格式。您知道,简单时间格式不支持大于24小时的时间。我昨晚把它编好了,但它不起作用。嗨,肖恩·帕特里克·弗洛伊德,谢谢!我读了《乔达时代》杂志支持的电影选辑后感到非常困惑。我将试用该代码并返回此线程。