2014-11-14 3 views
2

Я только что протестировал PeriodFormatterBuilder в рамках Joda Time. Когда я добавляю выходные данные недели к строителю, расчетное время является правильным. Но если недели не добавляется, что на самом деле то, что я хочу, строитель просто сбросив 7 дней:Joda Time PeriodFormatterBuilder

public class JodaTest { 
    public static void main(String[] args) { 

    // builder 1 (weeks inc.) 
    PeriodFormatterBuilder b1 = new PeriodFormatterBuilder(); 
    b1.appendYears().appendSuffix(" year", " years"); 
    b1.appendSeparator(" "); 
    b1.appendMonths().appendSuffix(" month", " months"); 
    b1.appendSeparator(" "); 
    // appends weeks ... 
    b1.appendWeeks().appendSuffix(" week", " weeks"); 
    b1.appendSeparator(" "); 
    b1.appendDays().appendSuffix(" day", " days"); 
    b1.appendSeparator(" "); 
    b1.printZeroIfSupported().minimumPrintedDigits(2); 
    b1.appendHours().appendSuffix(" hour", " hours"); 
    b1.appendSeparator(" "); 
    b1.appendMinutes().appendSuffix(" minutes"); 
    b1.appendSeparator(" "); 
    b1.appendSeconds().appendSuffix(" seconds"); 
    PeriodFormatter f1 = b1.toFormatter(); 

    // builder 2 (weeks not inc.) 
    PeriodFormatterBuilder b2 = new PeriodFormatterBuilder(); 
    b2.appendYears().appendSuffix(" year", " years"); 
    b2.appendSeparator(" "); 
    b2.appendMonths().appendSuffix(" month", " months"); 
    b2.appendSeparator(" "); 
    // does not append weeks ... 
    b2.appendDays().appendSuffix(" day", " days"); 
    b2.appendSeparator(" "); 
    b2.printZeroIfSupported().minimumPrintedDigits(2); 
    b2.appendHours().appendSuffix(" hour", " hours"); 
    b2.appendSeparator(" "); 
    b2.appendMinutes().appendSuffix(" minutes"); 
    b2.appendSeparator(" "); 
    b2.appendSeconds().appendSuffix(" seconds"); 
    PeriodFormatter f2 = b2.toFormatter(); 

    Period period = new Period(new Date().getTime(), new DateTime(2014, 12, 25, 0, 0).getMillis()); 

    System.out.println(f1.print(period)); 
    System.out.println(f2.print(period)); // 7 days missing? 
    } 
} 

распечатывает:

1 month 1 week 2 days 09 hours 56 minutes 21 seconds 
1 month 2 days 09 hours 56 minutes 21 seconds 

Во второй строке значение дня должно быть «9 дней». Как заставить строителя суммировать правильные дневные значения?

ответ

4

Объект Period Этот объект делит период на годы, месяцы, недели, дни и поля времени. Длительность более недели добавит к weeks полю, а days поля, более или менее, остаток от деления длительности на 7.

PeriodFormatter просто печатают поля, поскольку они находятся внутри объекта Period , Он не делает никаких расчетов. Если поле дней 2, оно останется 2, даже если вы не включили недели.

Чтобы получить период с неделей, представленной в дни поля вместо поля недель, вы должны либо создать период с другим типом:

Period periodWithoutWeeks = new Period(
    Date().getTime(), 
    new DateTime(2014, 12, 25, 0, 0).getMillis(), 
    PeriodType.yearMonthDayTime()); 

Или преобразовать период типу без недель, предполагая, в неделю стандартный 7 дней:

Period periodWithoutWeeks = period.normalizedStandard(PeriodType.yearMonthDayTime()); 

Теперь вы можете распечатать его с любым из форматтеров:

System.out.println(f2.print(periodWithoutWeeks)); 
+0

Хотя это обещание, это исключает меня: IllegalArgumentException: Период не поддерживает поле «недели». – Suma

+0

@ Сьюма справа. Предложение исправлено. – RealSkeptic

Смежные вопросы