【问题标题】:Timer - How do I calculate the difference between two dates using Joda Time?计时器 - 如何使用 Joda Time 计算两个日期之间的差异?
【发布时间】:2015-11-13 04:43:54
【问题描述】:

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

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

请指导我这样做。

【问题讨论】:

    标签: java jodatime


    【解决方案1】:

    查看 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));
    

    【讨论】:

    • 我看到我们必须使用 - org.joda.time.Period.Period(ReadableInstant startInstant, ReadableInstant endInstant) 作为他们在您的链接中给出的示例。如果你已经知道该怎么做,你能告诉我吗?
    • @davidblaine 我已经编辑了我的答案以包含一些示例代码。试试看。
    • 谢谢!输出是 - 2-10-5。我怎样才能使它成为 05 年 2 月 10 日?
    • 得到了这个想法 - stackoverflow.com/questions/275711/…
    • @ryvantage 看起来对我的原始答案的编辑导致了这个问题。现在应该修好了。
    【解决方案2】:

    我很欣赏 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 是微不足道的。

    【讨论】:

    • 它与可读性有关。大多数人看不到 86400 并立即想到一天中的秒数。此外,由于 java.util.Date 是可变的,它可能会导致令人头疼和错误,以至于人们宁愿使用第三方 API。上面来自@IceMan 的回复只有大约 3 行代码来完成他想要的内容,其余的用于格式化,任何人都更容易识别出意图是什么。
    • @dsingleton:可读性很重要,但我不明白为什么我提供的方法的意图应该是模糊的。例如,可以包含private final double MILLIS_IN_A_DAY = 86400.0 * 1000.0 以使最后一行中的计算更加清晰。而且,虽然 Date 确实是可变的,但上面的例程是线程安全的……而且这个例程可以很容易地修改为直接使用longs。这里的重点是,无需 Joda 就可以访问此问题的简单解决方案(它没有说明 Java 日期/时间 API 的更广泛含义)。
    猜你喜欢
    • 2014-03-07
    • 1970-01-01
    • 2014-10-01
    • 2021-11-25
    • 2011-08-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多