2017-02-10 3 views
2

analysiert wird Ich habe folgenden Code:Java 8 Datum/Zeit: sofort, kann nicht am Index 19

String dateInString = "2016-09-18T12:17:21:000Z"; 
Instant instant = Instant.parse(dateInString); 

ZonedDateTime zonedDateTime = instant.atZone(ZoneId.of("Europe/Kiev")); 
System.out.println(zonedDateTime); 

Es gibt mir folgende Ausnahme:

Exception in thread "main" java.time.format.DateTimeParseException: Text '2016-09-18T12: 17: 21: 000Z' konnte nicht bei Index 19 um analysiert werden java.time.format.DateTimeFormatter.parseResolved0 (DateTimeFormatter.java:1949) um java.time.format.DateTimeFormatter.parse (DateTimeForm atter.java:1851) bei java.time.Instant.parse (Instant.java:395) bei core.domain.converters.TestDateTime.main (TestDateTime.java:10)

Wenn ich das ändern letzter Doppelpunkt zu einem Punkt:

String dateInString = "2016-09-18T12:17:21.000Z"; 

... dann die Ausführung geht in Ordnung:

2016-09-18T15: 17: 21 + 03: 00 [Europa/Kiew]

Also, die Frage ist - wie mit Instant und Datum zu analysieren?

Antwort

3

Das "Problem" ist der Doppelpunkt vor Millisekunden, die Nicht-Standard (Standard ist ein Komma).

Damit es funktioniert, Sie DateTimeFormatter für das benutzerdefinierte Format ein eigenes aufbauen müssen:

String dateInString = "2016-09-18T12:17:21:000Z"; 
DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
    .append(DateTimeFormatter.ISO_DATE_TIME) 
    .appendLiteral(':') 
    .appendFraction(ChronoField.MILLI_OF_SECOND, 3, 3, false) 
    .appendLiteral('Z') 
    .toFormatter(); 
LocalDateTime instant = LocalDateTime.parse(dateInString, formatter); 
ZonedDateTime zonedDateTime = instant.atZone(ZoneId.of("Europe/Kiev")); 
System.out.println(zonedDateTime); 

Ausgabe dieses Codes:

2016-09-18T12:17:21+03:00[Europe/Kiev] 

Wenn Ihr Datetime wörtlichen statt einen Punkt hatte vom letzten Doppelpunkt wären die Dinge viel einfacher.

+0

Eigentlich ist der Standard ein COMMA * oder * ein FULL STOP (Periode), wobei das ** Komma bevorzugt wird **. Siehe * ISO 8601: 2004 * Dritte Ausgabe 2004-12-01, Abschnitt "4.2.2.4 Darstellungen mit Dezimalbruch": ... der Dezimalbruch ist vom ganzzahligen Teil durch das in ISO 31-0 angegebene Dezimalzeichen zu trennen, d Komma [,] oder Punkt [.]. Von diesen ist das Komma das bevorzugte Zeichen.... –

+0

@basil Vielleicht für ISO, aber nicht im JDK, [welches den Dezimalpunkt benutzt] (http://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatterBuilder.html#) appendFraction-java.time.temporal.TemporalField-int-int-boolean-) – Bohemian

1

Verwenden Sie ein SimpleDateFormat:

String dateInString = "2016-09-18T12:17:21:000Z"; 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SSS"); 
Instant instant = sdf.parse(dateInString).toInstant(); 
ZonedDateTime zonedDateTime = instant.atZone(ZoneId.of("Europe/Kiev")); 
System.out.println(zonedDateTime); 

2016-09-18T19: 17: 21 + 03: 00 [Europa/Kiew]

-1
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/MM/yyyy"); 

String date = "16/08/2016"; 

//convert String to LocalDate 
LocalDate localDate = LocalDate.parse(date, formatter); 

Wenn die String formatiert wie ISO_LOCAL_DATE, können Sie die Zeichenfolge direkt analysieren, keine Konvertierung erforderlich.

package com.mkyong.java8.date; 

import java.time.LocalDate; 

public class TestNewDate1 { 

    public static void main(String[] argv) { 

     String date = "2016-08-16"; 

     //default, ISO_LOCAL_DATE 
     LocalDate localDate = LocalDate.parse(date); 

     System.out.println(localDate); 

    } 

} 

Schauen Sie sich diese Website Site here

+0

Was ist mit der Zeitkomponente? – Bohemian