我使用一个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() );发布于 2014-10-10 06:59:12
这是因为使用方法Duration将Period转换为Duratoin::toPeriod。
在Joda-time文档中描述了这一点:
公共期间toPeriod()使用标准期间类型和ISO时间序列将此持续时间转换为期间实例。将只使用周期类型中的精确字段。因此,只有周期上的小时、分钟、秒和毫秒字段将被使用。年、月、周和日的字段将不会被填充。
在没有开始日期(或结束日期)的情况下,无法正确计算周期,因为有些日子可能是24小时或23小时(由于DST)。
你应该用Duration::toPeriodFrom方法代替
例如。
Duration duration = new Duration(date1, date2);
// ...
formatter.print( duration.toPeriodFrom(date1));发布于 2018-03-30 10:16:51
正如伊利亚所说,默认情况下,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");
}:https://stackoverflow.com/questions/26291271
复制相似问题