簡體   English   中英

JodaTime PeriodFormatter

[英]JodaTime PeriodFormatter

我有以下PeriodFormatter:

PeriodFormatter periodFormatter = new PeriodFormatterBuilder().printZeroAlways().minimumPrintedDigits(2).appendHours().appendSeparator(":")
        .appendMinutes().rejectSignedValues(false).maximumParsedDigits(2).toFormatter();

如果我解析例如-03:00 (三個小時):

final Duration hoursDuration = periodFormatter.parsePeriod(hours)

但是如果我解析-00:43 (45分鍾)比我得到一個正數持續時間,因為正確的格式是-00:-43

我的問題現在是periodFormatter是否有可能。

首先,我使您的代碼可編譯:

PeriodFormatter periodFormatter = 
    new PeriodFormatterBuilder().printZeroAlways().minimumPrintedDigits(2)
    .appendHours().appendSeparator(":")
    .appendMinutes().rejectSignedValues(false).maximumParsedDigits(2).toFormatter();
Period p1 = periodFormatter.parsePeriod("-03:00"); // PT-3H
System.out.println(p1);
Period p2 = periodFormatter.parsePeriod("-00:43"); // PT43M
System.out.println(p2);

觀察到的行為的解釋:

自開始以來,Joda-Time就以違反直覺的方式來處理任何時期的跡象。 標志從來整個時期無關 ,而是與一個時期的各個單獨組成部分 無關

  • 第一種情況“ -03:00” =>僅小時部分為負(分鍾為零)。
  • 第二種情況“ 00:43” =>小時部分為零,因此該符號沒有作用,而分鍾部分為正,因為它沒有直接在前面加上負號。

關於這種行為的意見是不同的。 盡管喬達團隊似乎將此視為增強功能和有用功能,但其他像我這樣的人卻發現這很糟糕。 例如,可以將周期構造為P1M-30D。 這個時期是正數,負數還是零? 我們真的不知道。 結果是,周期使屬性失去了特性,就像時間軸上的有向矢量的長度一樣(持續時間的特征)。

據我所知,沒有機會在Joda-Time中更改此行為。 如果要將“ -00:43”解析為-PT43M,請考慮以下選項:

a)手動解決方法:

String input = "-00:43";
boolean negative = input.charAt(0) == '-';
Period p3 = periodFormatter.parsePeriod(input.replace("-", ""));
if (negative) {
    p3 = p3.negated();
}
System.out.println(p3); // PT-43M

b)使用我的圖書館Time4J

這是解決您具體問題的大炮,但值得一看,因為規范化,格式化或解析任何持續時間的可能性不勝枚舉。 Time4J拒絕混合符號,因此該符號只能在整個持續時間之前。

Duration<ClockUnit> d = Duration.formatter(ClockUnit.class, "-hh:mm").parse(input);
System.out.println(d); // -PT43M

暫無
暫無

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

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