代码之家  ›  专栏  ›  技术社区  ›  Romain Linsolas

使用jodatime正确定义持续时间

  •  1
  • Romain Linsolas  · 技术社区  · 14 年前

    我创建了一个方法,它需要两个日期(以毫秒为单位),并返回一个指示这两个日期之间持续时间的语句。

    目前,我有以下代码:

    public static String formatDuration(long start, long end) {
        Interval interval = new Interval(start, end);
        return getPeriodFormatter().print(interval.toPeriod()).trim();
    }
    
    private static PeriodFormatter getPeriodFormatter() {
        PeriodFormatter pf = new PeriodFormatterBuilder().printZeroRarelyFirst()
            .appendYears().appendSuffix("y ", "y ")
            .appendMonths().appendSuffix("m" , "m ")
            .appendDays().appendSuffix("d ", "d ")
            .appendHours().appendSuffix("h ", "h ")
            .appendMinutes().appendSuffix("m ", "m ")
            .appendSeconds().appendSuffix("s ", "s ")
            .toFormatter();
    
        return pf;
    }
    

    但是,我想我误解了在jodatime中定义间隔的方式。如果我尝试以下测试代码:

    @Test
    public void foobar() {
        try {
            TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy");
            long start = sdf.parse("10:30:00 24/06/2009").getTime();
            long end = sdf.parse("23:05:17 22/08/2009").getTime();
            System.out.println("Duration: " + formatDuration(start, end));
        } catch (Exception e) {
            e.printStackTrace();
            fail("Could not test duration.");
        }
    }
    

    我得到以下输出,这是错误的(特别是在白天部分):

    Duration: 1m 1d 12h 35m 17s
    

    如何定义jodatime中的正确持续时间?


    好吧,事实上,我忘记了 PeriodFormatter 是附加周。 因此,如果我加上周数,我得到以下输出,这是正确的:

    Duration: 1m 4w 1d 12h 35m 17s
    

    所以我的问题变了一点:有没有一种方法可以显示月份中的天数而不是周+天?换句话说,不是有:

    持续时间:1m 4w 1d 12h 35m 17s
    

    我想拥有:

    Duration: 1m 29d 12h 35m 17s
    
    1 回复  |  直到 14 年前
        1
  •  5
  •   Mike Q    14 年前

    试试这个。

        Period period = interval.toPeriod( PeriodType.yearMonthDayTime() );
    

    在设置句点格式之前。