Java 计时器-如何使用Joda Time计算两个日期之间的差异?

Java 计时器-如何使用Joda Time计算两个日期之间的差异?,java,jodatime,Java,Jodatime,我想用Joda时间得到两个时间p(开始时间)和Q(结束时间)的差。P和Q可以是不同天甚至同一天的时间。我想得到格式HH-MM-SS的差异,其中H=小时,M=分钟,S=秒 我想在计时器中使用此功能。我假设没有人会用我的计时器测量超过24小时 请指导我这样做。看看Joda time常见问题解答 您可以使用PeriodFormatter获取您选择的格式。请尝试以下示例代码 DateTime dt = new DateTime(); DateTime twoHoursLater = dt.plusHo

我想用Joda时间得到两个时间p(开始时间)和Q(结束时间)的差。P和Q可以是不同天甚至同一天的时间。我想得到格式HH-MM-SS的差异,其中H=小时,M=分钟,S=秒

我想在计时器中使用此功能。我假设没有人会用我的计时器测量超过24小时


请指导我这样做。

看看Joda time常见问题解答

您可以使用
PeriodFormatter
获取您选择的格式。请尝试以下示例代码

DateTime dt = new DateTime();
DateTime twoHoursLater = dt.plusHours(2).plusMinutes(10).plusSeconds(5);
Period period = new Period(dt, twoHoursLater);
PeriodFormatter HHMMSSFormater = new PeriodFormatterBuilder()
        .printZeroAlways()
        .minimumPrintedDigits(2)
        .appendHours().appendSeparator("-")
        .appendMinutes().appendSeparator("-")
        .appendSeconds()
        .toFormatter(); // produce thread-safe formatter
System.out.println(HHMMSSFormater.print(period));

我很欣赏Joda日期/时间API。它提供了一些很酷的功能,如果我需要一个不可变的日历或者它提供的一些深奥的日历选项,我会全力以赴

但它仍然是一个外部API

所以。。。不用的时候为什么还要用呢。在JodaAPI中,“即时”与JavaAPI的“日期”完全相同(或者非常接近)。这两个都是围绕表示POSIX EPOCH UTC时间(即自UTC 1970年1月1日凌晨00:00起经过的毫秒数)中的一个瞬间的长的薄包装

如果您有两个瞬间或两个日期,那么计算它们之间的天数是很简单的,而Joda库绝对不需要单独用于此目的:

public double computeDaysBetweenDates(Date earlier, Date later) {
    long diff;

    diff = later.getTime() - earlier.getTime();
    return ((double) diff) / (86400.0 * 1000.0);
}
这假设一天的秒数是86400…这基本上是正确的


一旦你有一个双精度差,将答案的分数部分(即一天的分数)转换成HH:MM:SS是很简单的。

我发现我们必须使用-org.joda.time.Period.Period(ReadableInstant startInstant,ReadableInstant endInstant)例如他们在你的链接中给出的示例。如果你已经知道如何做到这一点,你能给我看一下吗?@davidblaine我已经编辑了我的答案,加入了一些示例代码。试试看。谢谢!输出是-2-10-5。我如何使它成为02-10-05?我在这里有了想法-@ryvantage它看起来像是对我原始答案的编辑导致了问题。它应该是f现在是ixed。它与可读性有关。大多数人看不到86400,会立即想到一天中的秒数。此外,由于java.util.Date是可变的,它可能会引起头痛和错误,以至于人们宁愿使用第三方API。上面@IceMan的响应只有大约3行代码来完成他想要的任务剩下的是格式化,代码对任何人来说都更容易辨别意图是什么。@dsingleton:可读性很重要,但我不明白为什么我提供的方法的意图应该是模糊的。例如,可以包括
private final double MILLIS_IN_A_DAY=86400.0*1000.0
以在f中进行计算最后一行更清楚。虽然日期确实是可变的,但上面的例程是线程安全的……而且这个例程可以很容易地修改为直接使用
longs
。这里的要点是,这个问题的简单解决方案是无需Joda即可访问的(它没有谈到Java日期/时间API的更广泛含义)。