PeriodFormatter不显示天数

时间:2014-10-10 02:59:36

标签: java datetime jodatime periodformatter

我使用PeriodFormatter返回一个字符串,显示事件发生的时间。下面的代码不断创建字符串,如1146小时39分钟,而不是x天y小时z分钟。有什么想法吗?

谢谢, 森

   PeriodFormatter formatter = new PeriodFormatterBuilder()
                .printZeroNever()
                .appendDays()
                .appendSuffix( "d " )
                .appendHours()
                .appendSuffix( "h " )
                .appendMinutes()
                .appendSuffix( "m " )
                .toFormatter();
        return formatter.print( duration.toPeriod() );

2 个答案:

答案 0 :(得分:6)

这是因为您使用方法DurationPeriod转换为Duratoin::toPeriod 这在Joda-time文档中有描述:

  

public Period toPeriod()将此持续时间转换为Period实例   使用标准时期类型和ISO年表。 只有精确   将使用句点类型中的字段。因此,只有小时,分钟,   将使用该期间的第二和毫秒字段。那一年,   不会填充月,周和日字段。

在没有开始日期(或结束日期)的情况下,可以正确计算期间奖励,因为有些日子可能 24h 23h (由于DST)< / p>

你应该使用方法Duration::toPeriodFrom方法来代替 例如。

Duration duration = new Duration(date1, date2);  
// ...  
formatter.print( duration.toPeriodFrom(date1));

答案 1 :(得分:0)

正如Ilya默认所说,toPeriod方法只会填充小时,分钟,秒和毫秒字段。 但实际上你可以使用normalizedStandard将其标准化,以便

String periodFormat(Duration d) {
    return PERIOD_FORMATTER.print(d.toPeriod().normalizedStandard());
}

static final PeriodFormatter PERIOD_FORMATTER = new PeriodFormatterBuilder()
  .appendWeeks().appendSuffix("w")
  .appendSeparator("_")
  .printZeroRarelyLast()

  .appendDays().appendSuffix("d")
  .appendSeparator("_")
  .printZeroRarelyLast()

  .appendHours().appendSuffix("h")
  .appendSeparator("_")
  .printZeroRarelyLast()

  .appendMinutes().appendSuffix("m")
  .appendSeparator("_")
  .printZeroRarelyLast()

  .toFormatter();

将通过

  @Test
  public void periodFormatTest {
    assertThat(periodFormat(Duration.standardMinutes(5))).isEqualTo("5m");
    assertThat(periodFormat(Duration.standardMinutes(60))).isEqualTo("1h");
    assertThat(periodFormat(Duration.standardDays(1))).isEqualTo("1d");
    assertThat(periodFormat(Duration.standardDays(2))).isEqualTo("2d");
    assertThat(periodFormat(Duration.standardHours(47))).isEqualTo("1d_23h");

  }: