使用Joda-Time PeriodFormatter显示“负”时间段

时间:2011-06-17 14:59:51

标签: java jodatime periodformatter


我在项目中使用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)的{​​{1}}方法的预期行为只会显示Formatter只签署第一个元素,如:

-

我误解了API,还是这个错误? JodaStephen?任何人吗?

展示我想要的东西并不难,但我只是对Builder方法感到好奇。

谢谢,
-Manuel

2 个答案:

答案 0 :(得分:1)

rejectSignedValues的Javadoc说Reject signed values when parsing the next and following appended fields,即。它只会影响解析,而不会影响打印。

您的提案可能会有所改进,但无法保证所有组件都是正面的,或者都是负面的。这也是一个有效期:P-6D8H(正面和负面的混合)。

答案 1 :(得分:0)

我像这样解决消极:

 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);
    }