簡體   English   中英

使用Joda-Time PeriodFormatter顯示“負”時間段

[英]Displaying “negative” time periods with Joda-Time 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存儲其日期和時間的每個組成部分,但對我來說,構建Formatter.rejectSignedValues(true)方法的預期行為是僅顯示第一個元素的-符號,如:

Negative Period: -02:56:02

我誤解了API,還是這個bug? JodaStephen? 任何人?

展示我想要的東西並不難,但我只是對Builder方法感到好奇。

謝謝,
-Manuel

rejectSignedValues的Javadoc表示Reject signed values when parsing the next and following appended fields ,即。 它只會影響解析,而不會影響打印。

您的提案可能會有所改進,但無法保證所有組件都是正面的,或者都是負面的。 這也是一個有效期: P-6D8H (正面和負面的混合)。

我像這樣解決負面問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM