那麼,在Joda-Time中沒有任何格式支持你想看到消極持續時間的方式。我可以看到的每個文檔(用名稱表示)的最近值可能是方法rejectSignedValues()。我已經在所有可能的配置中對它進行了測試(插入它的開始處,直接在appendMinutes()
之前,在所有情況下都有未記錄的參數false
或true
),但它在我的測試中沒有做任何事情(請參閱更新的附註) 。
因此,有邏輯上只剩兩選項:
a)寫出這個技巧:
PeriodFormatter hoursAndMinutesFormatter = new PeriodFormatterBuilder()
.printZeroAlways()
.minimumPrintedDigits(2)
.appendHours()
.appendSeparator(":")
//.rejectSignedValues(true) // no effect ?!
.appendMinutes()
.toFormatter();
long millis = -27900000;
Duration d = new Duration(millis);
Period p = d.toPeriod();
String s;
if (millis < 0) {
s = "-" + hoursAndMinutesFormatter.print(p.negated());
} else {
s = hoursAndMinutesFormatter.print(p);
}
System.out.println("Joda-Time: " + s); // -07:45
B)或者切換到具有負的持續時間更好地支持另一個庫。
=>例如內置具有更好的跡象處理,但沒有真正的格式化超越XML的架構相容表示(XML持續時間雖然你可以自由查詢持續時間的單一成分,並假設其格式化java.util.Formatter
)。
long millis = -27900000;
javax.xml.datatype.Duration xmlDuration =
DatatypeFactory.newInstance().newDuration(millis);
System.out.println("XML: " + xmlDuration.toString()); // -P0Y0M0DT7H45M0.000S
System.out.println(
String.format(
"%1$s%2$02d:%3$02d",
xmlDuration.getSign() < 0 ? "-" : "+",
xmlDuration.getHours(),
xmlDuration.getMinutes())); // -07:45
=>或使用我的圖書館Time4J具有pattern-based時間格式:
long millis = -27900000;
Duration<ClockUnit> duration = Duration.of(millis, ClockUnit.MILLIS); // create
duration = duration.with(Duration.STD_CLOCK_PERIOD); // normalization to hours and minutes
String s = Duration.formatter("-hh:mm").format(duration);
System.out.println("Time4J: " + s); // -07:45
旁註:
新的Java-8類Duration
和Period
有th與Joda-Time相同的符號處理(更喜歡不在前面但在每個組件之前的符號)。當您觀察方法toString()
的輸出時,您可以看到它。不提供任何特殊的持續時間格式化程序。
Joda-Time的符號處理與XML-Schema v1.1不兼容(請特別注意3.3.6.2節詞法映射)。
現在我已經找到了方法rejectSignedValues()
的用途。它與for parsing only相關,只是控制異常行爲(可通過其布爾參數進行配置)。但是,解析「-07:45」等值會產生與您的輸入不同的意外毫秒值(-22500000!= -27900000)。
什麼是「Joda-Time的符號處理與XML-Schema不兼容」。應該是什麼意思?哪個模式/模式版本?這沒有多大意義... – specializt
@specializt這使得很多道理。 XML-Schema中不允許格式「-07:-45」。參見[w3c-page](http://www.w3.org/TR/2012/REC-xmlschema11-2-20120405/#duration)。 –
@specializt我想說:「PT-7H:-45M」而不是「-07:-45」。 –