Отображение «отрицательных» периодов времени с Joda-Time PeriodFormatter - PullRequest
3 голосов
/ 17 июня 2011


Я использую joda-time (1.6.2) в проекте, и одна из вещей, которые я делаю, это получение разницы между прогнозируемым временем и фактическим временем.Иногда это различие положительное, иногда отрицательное.Хотя подходящий подход может заключаться в использовании Duration, а не Period, использование PeriodFormatter для отображения результата привело меня к вопросу о классе PeriodFormatterBuilder.В качестве примера:

DateTime d1 = new DateTime(2011, 6, 17, 13, 13, 5, 0) ;
DateTime d2 = new DateTime(2011, 6, 17, 10, 17, 3, 0) ;

Period negativePeriod = new Period(d1, d2);
Period positivePeriod = new Period(d2, d1);

PeriodFormatter pf = new PeriodFormatterBuilder()
    .minimumPrintedDigits(2)
    .appendHours()
    .appendSuffix(":")
    .rejectSignedValues(true) // Does this do anything?
    .appendMinutes()
    .appendSuffix(":")
    .appendSeconds()
    .toFormatter();

System.out.printf("Negative Period: %s\n", pf.print(negativePeriod));
System.out.printf("Positive Period: %s\n", pf.print(positivePeriod));

Вывод этого:

Negative Period: -02:-56:-02
Positive Period: 02:56:02

Я понимаю, что Period хранит каждый компонент своей даты и времени отдельно, но для меня ожидаемыйПоведение метода .rejectSignedValues(true) для построения Formatter заключается в отображении знака - только для первого элемента, например:

Negative Period: -02:56:02

Я неправильно понимаю API или это ошибка?JodaStephen?Кто-нибудь?

Работа с отображением того, что я хочу, не сложна, но мне просто любопытно подход Builder.

Спасибо,
-Manuel

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Javadoc для rejectSignedValues говорит Reject signed values when parsing the next and following appended fields, т.е.это влияет только на синтаксический анализ, а не на печать.

Ваше предложение может внести полезные улучшения, но нет гарантии, что все компоненты будут положительными или отрицательными.Это также допустимый период: P-6D8H (смесь положительного и отрицательного).

0 голосов
/ 21 февраля 2017

Я решаю минус следующим образом:

 Duration dToFormat = duration;
    if (duration.getStandardMinutes() < 0) {
        dToFormat = duration.minus(duration).minus(duration);
    }

    ...

    if (duration.getStandardMinutes() < 0) {
                return "-"+pf.print(p); // leading minus
            }

и весь код здесь в моем случае:

public static String durationToHHHmmFormat(Duration duration, String separator){
        if ( duration == null ) {
            return null;
        }

        Duration dToFormat = duration;
        if (duration.getStandardMinutes() < 0) {
            dToFormat = duration.minus(duration).minus(duration);
        }

        Period p = dToFormat.toPeriod();
        PeriodFormatter pf = new PeriodFormatterBuilder()
            .printZeroAlways()
            .minimumPrintedDigits(2) // gives the '01'
            .appendHours()
            .appendSeparator(separator)
            .appendMinutes()
            .toFormatter();

        if (duration.getStandardMinutes() < 0) {
            return "-"+pf.print(p); // leading minus
        }
        return pf.print(p);
    }
...