2017-07-25 100 views
1

我遇到問題,解析一個特殊的字符串表示一年和一個月份,像這樣的偏移量:2014-08+03:00Java DateTimeFormatter解析YearMonth與偏移量

期望的輸出是YearMonth

我已經測試過創建具有各種圖案的自定義DateTimeFormatter,但它失敗並且引發了DateTimeParseException

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MMZ"); 
TemporalAccessor temporalAccessor = YearMonth.parse(month, formatter); 
YearMonth yearMonth = YearMonth.from(temporalAccessor); 

此特定格式的正確模式是什麼?

它甚至有可能創造一個DateTimeFormatter來解析這個String,或者我應該操作字符串"2014-08+03:00"並刪除手動偏移"2014-08",然後將其解析爲YearMonth(或其他一些java.time類)?

編輯:

我進一步研究其中屬性被列爲<xs:attribute name="month" type="xs:gYearMonth"/>在命名空間是xmlns:xs="http://www.w3.org/2001/XMLSchema">

因此很明顯,該屬性的類型的API和它的.xsd架構文件是DataTypeConstans.GYEARMONTH哪裏「2014-08 + 03:00」是有效的格式。

This回答解釋瞭如何將String轉換爲XMLGregorianCalendar,從那裏可以通過OffsetDateTime轉換爲YearMonth

XMLGregorianCalendar result = DatatypeFactory.newInstance().newXMLGregorianCalendar("2014-08+03:00"); 
YearMonth yearMonth = YearMonth.from(result.toGregorianCalendar().toZonedDateTime().toOffsetDateTime()); 

但是我仍然好奇,如果有可能只使用自定義java.time.DateTimeFormatter直接解析字符串"2014-08+03:00"YearMonth

+0

'YearMonth'不包含時區信息... – assylias

+0

是的,我知道,我想知道爲什麼API包含偏移量,而我自己也不需要偏移量。 @assylias – andnyl

回答

3

的偏移+03:00正確的模式是XXX(檢查javadoc的細節 - 實際上DateTimeFormatterBuilder文檔有一個more detailed explanation):

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MMXXX"); 
String str = "2014-08+03:00"; 
YearMonth yearMonth = YearMonth.parse(str, formatter); 
System.out.println(yearMonth); 

輸出將是:

2014-08

+2

就是這樣!現在我看到「三個字母輸出小時和分鐘,並帶有冒號,例如'+01:30'。」謝謝! – andnyl

+0

@andnyl不客氣,很高興幫助! – 2017-07-25 12:08:17

相關問題