2017-07-18 114 views
0

我想將字符串轉換爲ZonedDateTime。ZonedDateTime解析異常

我曾嘗試以下操作:

SimpleDateFormat zonedDateTimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z"); 
zonedDateTimeFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 

long timeMs = zonedDateTimeFormat.parse("2017-07-18T20:26:28.582+03:00[Asia/Istanbul]").getTime(); 

它給java.text.ParseException: Unparseable date

如何可以解析以下字符串ZonedDateTime

2017-07-18T20:26:28.582+03:00[Asia/Istanbul] 

回答

3

java.time API具有許多內置格式,可以簡化解析和格式化過程。您嘗試解析的字符串採用標準的ISO_ZONED_DATE_TIME格式。所以,你可以用下面的方法很容易地解析它,然後從這個紀元獲得毫秒級:

DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME ; 
ZonedDateTime zdt = ZonedDateTime.parse(
         "2017-07-18T20:26:28.582+03:00[Asia/Istanbul]", 
         formatter); // prints 2017-07-18T20:26:28.582+03:00[Asia/Istanbul] 
long timeInMs = zdt.toInstant().toEpochMilli(); 
2

對於ZonedDateTime我們需要使用ZonedDateTime.parse方法DateTimeFormatter。如果我沒看錯你有一個ISO日期:

ZonedDateTime zonedDateTime = ZonedDateTime.parse(
     "2017-07-18T20:26:28.582+03:00[Asia/Istanbul]", 
     DateTimeFormatter.ISO_DATE_TIME 
); 
System.out.println(zonedDateTime); //2017-07-18T20:26:28.582+03:00[Asia/Istanbul] 

您可以使用ISO_ZONED_DATE_TIMEISO_DATE_TIME。兩者都能夠用偏移量和區域來解析日期時間。

+0

你很不對。它不是一個ISO格式,因爲方括號中的尾隨區域標識符(但在API中稱爲「ISO _...」,在javadoc中有小的解釋性說明:「方括號中的部分不是ISO-8601標準「)。 –

+0

@MenoHochschild非常感謝您的澄清。我不確定。 –