2017-07-18 9 views
0

J'essaye de convertir la chaîne en ZonedDateTime.ZonedDateTime parse exception

J'ai essayé suivante:

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(); 

Il donne java.text.ParseException: Unparseable date

Comment puis-je analyser la chaîne suivante dans ZonedDateTime

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

Répondre

3

L'API java.time a de nombreux formats intégrés qui simplifient le processus d'analyse et de formatage. La chaîne que vous essayez d'analyser est au format standard ISO_ZONED_DATE_TIME. Donc, vous pouvez l'analyser facilement de la façon suivante et ensuite obtenir les millisecondes de l'époque:

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.parse semble être conçu pour gérer la chaîne exacte que vous à condition de. Il n'est pas nécessaire de passer par l'ancien SimpleDateFormat

2

Pour ZonedDateTime nous devons utiliser la méthode ZonedDateTime.parse avec DateTimeFormatter. Si je ne me trompe pas, vous avez une date 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] 

Vous pouvez utiliser ISO_ZONED_DATE_TIME ou ISO_DATE_TIME. Les deux sont capables d'analyser une date-heure avec décalage et zone.

+0

Vous avez malheureusement tort. Ce n'est pas un format ISO en raison de l'identificateur de zone de fin entre crochets (mais est néanmoins appelé "ISO _..." dans l'API, avec la petite note explicative dans le javadoc: "La section entre crochets ne fait pas partie de la norme ISO-8601. "). –

+0

@MenoHochschild merci beaucoup pour votre clarification. Je n'étais pas sûr à ce sujet. –