2016-01-17 30 views
3

我有一段時間,例如,像這樣:在JodaTime中將字符串轉換爲字符串

PT-27900S = -27900000 milliseconds 

,我想將其轉換成與格式的String(+/- HH:MM) ICH我轉換一個是負面的持續時間字符串:

final PeriodFormatter hoursAndMinutesFormatter = new PeriodFormatterBuilder() 
               .printZeroAlways() 
               .minimumPrintedDigits(2) 
               .appendHours() 
               .appendSeparator(":") 
               .appendMinutes() 
               .toFormatter(); 

我得到例如這個結果:

-07:-45 

但我想要這樣。

-07:45 

有沒有可能像這樣格式化它?

回答

0

那麼,在Joda-Time中沒有任何格式支持你想看到消極持續時間的方式。我可以看到的每個文檔(用名稱表示)的最近值可能是方法rejectSignedValues()。我已經在所有可能的配置中對它進行了測試(插入它的開始處,直接在appendMinutes()之前,在所有情況下都有未記錄的參數falsetrue),但它在我的測試中沒有做任何事情(請參閱更新的附註) 。

因此,有邏輯上只剩兩選項:

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 

旁註:

  1. 新的Java-8類DurationPeriod有th與Joda-Time相同的符號處理(更喜歡不在前面但在每個組件之前的符號)。當您觀察方法toString()的輸出時,您可以看到它。不提供任何特殊的持續時間格式化程序。

  2. Joda-Time的符號處理與XML-Schema v1.1不兼容(請特別注意3.3.6.2節詞法映射)。

  3. 現在我已經找到了方法rejectSignedValues()的用途。它與for parsing only相關,只是控制異常行爲(可通過其布爾參數進行配置)。但是,解析「-07:45」等值會產生與您的輸入不同的意外毫秒值(-22500000!= -27900000)。

+0

什麼是「Joda-Time的符號處理與XML-Schema不兼容」。應該是什麼意思?哪個模式/模式版本?這沒有多大意義... – specializt

+0

@specializt這使得很多道理。 XML-Schema中不允許格式「-07:-45」。參見[w3c-page](http://www.w3.org/TR/2012/REC-xmlschema11-2-20120405/#duration)。 –

+0

@specializt我想說:「PT-7H:-45M」而不是「-07:-45」。 –