0

我正在尝试将字符串转换为 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]
4

3 回答 3

3

API 有许多简化解析和格式化过程的java.time内置格式。您尝试解析的字符串采用标准ISO_ZONED_DATE_TIME格式。因此,您可以通过以下方式轻松解析它,然后从 epoch 获取毫秒数:

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();
于 2017-07-18T09:19:48.590 回答
2

ZonedDateTime.parse似乎旨在处理您提供的确切字符串。没有必要经历旧的SimpleDateFormat

于 2017-07-18T09:13:23.910 回答
2

对于 ZonedDateTime,我们需要使用ZonedDateTime.parsewith 方法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。两者都能够解析带有偏移量和区域的日期时间。

于 2017-07-18T09:14:56.223 回答