2

我有以下时期 1month 5d 22h 35m 39s,我想将其格式化为 35d 22h 35m 39s。但是,当使用以下格式化程序时,月份只是被删除并且没有被添加到天数中:

PeriodFormatter formatter = new PeriodFormatterBuilder()
    .printZeroAlways()
    .appendDays().appendSuffix(" d ")
    .appendHours().appendSuffix(" h ")
    .appendMinutes().appendSuffix(" m ")
    .appendSeconds().appendSuffix(" s ")
    .toFormatter();

经过一番搜索,我发现应该在 Period 上使用 normalizedStandard() 方法,但是在使用它period.normalizedStandard(PeriodType.dayTime())时出现以下错误:

java.lang.UnsupportedOperationException: Field is not supported
    at org.joda.time.PeriodType.setIndexedField(PeriodType.java:690)
    at org.joda.time.Period.withMonths(Period.java:851)
    at org.joda.time.Period.normalizedStandard(Period.java:1541)
    at amadeus.bid.wicket.markup.html.CountDownLabel.onComponentTagBody(CountDownLabel.java:34)

有任何想法吗?

4

2 回答 2

1

就像以利亚康奈尔一样悲伤,一般来说,将月份转换为几天是没有意义的,因为月份的长度会有所不同。

DateTime但是可以想象一个应用程序,其中将周期加到特定开始(例如当前时间)是有意义的,Duration从开始计算到结果并将持续时间转换为周期PeriodType.dayTime()

// 1 month 5d 22h 35m 39s
Period period = new Period(0, 1, 0, 5, 22, 35, 39, 0);

Instant start = new Instant();
// current time => 2011-03-17T22:24:01.848+01:00
Duration dura = new Duration(start, start.toDateTime().plus(period));
Period period2 = new Period(dura).normalizedStandard(PeriodType.dayTime());
// => 36d 21h 35m 39s

虽然结果取决于开始、它的时区、超过夏令时边界等,但此时并没有达到预期的效果35d 22h 35m 39s,但36d 21h 35m 39s在我看来这是否有意义,因为它是Periodto plus to an DateTimeto的一般用例产生一个新的DateTime.

于 2011-03-17T21:48:26.627 回答
0

我认为不可能将一段时间内的设定月数可靠地转换回天数,因为一个月中的天数会有所不同。

例子:

//From: 1month 5d 22h 35m 39s
Period period = new Period(0, 1, 0, 5, 22, 35, 39, 0);
//To: 35d 22h 35m 39s.
period.toStandardDays();

引发以下异常:java.lang.UnsupportedOperationException:无法转换为天,因为此期间包含月份且月份长度不同

于 2010-11-10T14:55:16.853 回答