Java 使用JodaTime正确定义持续时间

Java 使用JodaTime正确定义持续时间,java,jodatime,Java,Jodatime,我创建了一个方法,该方法使用两个日期(以毫秒为单位),并返回一个指示这两个日期之间持续时间的句子 目前,我有以下代码: public static String formatDuration(long start, long end) { Interval interval = new Interval(start, end); return getPeriodFormatter().print(interval.toPeriod()).trim(); } private st

我创建了一个方法,该方法使用两个日期(以毫秒为单位),并返回一个指示这两个日期之间持续时间的句子

目前,我有以下代码:

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.");
    }
}
我得到以下输出,这是错误的(特别是在白天部分):

如何在JodaTime中定义正确的持续时间


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

Duration: 1m 4w 1d 12h 35m 17s
所以我的问题有点变化:有没有办法显示月份的天数而不是周+天?换言之,不是:

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

Duration: 1m 29d 12h 35m 17s
试试这个

    Period period = interval.toPeriod( PeriodType.yearMonthDayTime() );
在格式化句点之前。

试试这个

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

设置期间格式之前。

只是为了补充-问题是您没有打印标准期间中包含的周数。只是为了补充-问题是您没有打印周数,其中包括在标准周期中。作为旁白,我还建议您使用Joda DateTimeFormat和相关类,而不是JDK格式化程序。作为旁白,我还建议您使用Joda DateTimeFormat和相关类,而不是JDK格式化程序。