2

次の期間があります1month5d22h 35m 39s、35d 22h35m39sとしてフォーマットしたいと思います。ただし、次のフォーマッタを使用する場合、月は削除され、日には追加されません。

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

Elijah Cornellの悲しみのように、月の長さはさまざまであるため、一般に月を日に変換することは意味がありません。

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が、 to plus to toの36d 21h 35m 39s一般的な使用例であるため、これは私の意見では理にかなっています。新しいを生成します。PeriodDateTimeDateTime

于 2011-03-17T21:48:26.627 に答える
0

1か月の日数は変動するため、ある期間の設定された月数を確実に日数に戻すことはできないと思います。

例:

//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 に答える