我使用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() );
答案 0 :(得分:6)
这是因为您使用方法Duration将Period转换为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");
}: