[英]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就以違反直覺的方式來處理任何時期的跡象。 標志從來與整個時期無關 ,而是與一個時期的各個單獨組成部分 無關 。
關於這種行為的意見是不同的。 盡管喬達團隊似乎將此視為增強功能和有用功能,但其他像我這樣的人卻發現這很糟糕。 例如,可以將周期構造為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.