【发布时间】:2015-11-13 04:43:54
【问题描述】:
我想使用 Joda Time 获得两次 P(开始时间)和 Q(结束时间)之间的差异。 P 和 Q 可以是不同日子甚至同一天的时间。我想获得 HH-MM-SS 格式的差异,其中 H=小时,M=分钟,S=秒。
我想在计时器中使用此功能。我假设没有人会使用我的计时器来测量超过 24 小时。
请指导我这样做。
【问题讨论】:
我想使用 Joda Time 获得两次 P(开始时间)和 Q(结束时间)之间的差异。 P 和 Q 可以是不同日子甚至同一天的时间。我想获得 HH-MM-SS 格式的差异,其中 H=小时,M=分钟,S=秒。
我想在计时器中使用此功能。我假设没有人会使用我的计时器来测量超过 24 小时。
请指导我这样做。
【问题讨论】:
查看 Joda time 常见问题解答 http://joda-time.sourceforge.net/faq.html#datediff
您可以使用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。
所以...为什么在你不需要的时候使用它。在 Joda API 中,“即时”与 Java API“日期”完全相同(或非常接近)。这些都是围绕 long 的瘦包装器,表示 POSIX EPOCH UTC 时间(这是自 1970 年 1 月 1 日上午 00:00 UTC 以来经过的毫秒数。
如果您有两个 Instants 或两个 Dates,计算它们之间的天数是微不足道的,并且绝对不需要 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 是微不足道的。
【讨论】:
private final double MILLIS_IN_A_DAY = 86400.0 * 1000.0 以使最后一行中的计算更加清晰。而且,虽然 Date 确实是可变的,但上面的例程是线程安全的……而且这个例程可以很容易地修改为直接使用longs。这里的重点是,无需 Joda 就可以访问此问题的简单解决方案(它没有说明 Java 日期/时间 API 的更广泛含义)。