Отображение периода с днями, часами, минутами и секундами - PullRequest
2 голосов
/ 10 ноября 2010

У меня следующий период 1 месяц 5д 22ч 35м 39с, который я хочу отформатировать как 35д 22ч 35м 39с.Однако при использовании следующего форматера месяцы просто удаляются и не добавляются к дням:

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

После некоторого поиска я обнаружил, что предполагается использовать метод normalizedStandard () для Period,при использовании с 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)

Есть идеи?

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Как и Элайджа Корнелл: в общем не имеет смысла переводить месяцы в дни, так как месяцы различаются по длине.

Однако можно представить себе приложение, в котором имеет смысл добавлять период к определенному началу 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 может иметь смысл в моем мнение, потому что это общий случай использования Period к плюсу к DateTime для получения нового DateTime.

0 голосов
/ 10 ноября 2010

Не думаю, что можно будет надежно преобразовать заданное количество месяцев в периоде обратно в дни, потому что количество дней в месяце меняется.

Пример:

//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: Невозможно преобразовать в Дни, поскольку этот период содержит месяцы, а месяцы различаются по длине

...