2017-06-11 2 views
-2

Ich versuche Zeichenfolge von JSON zu ZonedDateTime zu konvertieren wieKann Zeichenkette nicht zu ZonedDateTime konvertieren: DateTimeParseException

static String getWatchTime(JSONObject aJson, JSONObject bJson) { 
    long difference = 0 ; 
    try { 
     String aTime = aJson.getString("time_utc_8"); 
     String bTime = bJson.getString("time_utc_8"); 

     String pattern = "yyyy-MM-dd HH:mm:ss.SSSSSS"; 
     DateTimeFormatter Parser = DateTimeFormatter.ofPattern(pattern).ISO_DATE; 

     System.out.println(aTime); 

     ZonedDateTime a = ZonedDateTime.parse(aTime, Parser); 
     ZonedDateTime b = ZonedDateTime.parse(bTime, Parser); 

     ChronoUnit unit = null; 
     difference = unit.between(a, b); 

     System.out.println(difference); 

    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    String t = difference +""; 
    return t; 

} 

und immer bekommen die Fehler

Exception in thread "main" java.time.format.DateTimeParseException: Text '2016-06-28 22:29:44.700228' could not be parsed: Unable to obtain OffsetDateTime from TemporalAccessor: {},ISO resolved to 2016-06-28T22:29:44.700228 of type java.time.format.Parsed 
at java.time.format.DateTimeFormatter.createError(Unknown Source) 
at java.time.format.DateTimeFormatter.parse(Unknown Source) 
at java.time.OffsetDateTime.parse(Unknown Source) 
at Q2.getWatchTime(Q2.java:321) 
at Q2.WatchTime(Q2.java:265) 
at Q2.main(Q2.java:31) 

ich den Unterschied zwischen diesen erhalten möchten zwei Tage. Ich habe versucht SimpleDateFormat, aber es wird das Fehlerergebnis für die Mühlen bekommen.

+3

Es ist nicht viel Sinn macht, einen 'Parser' zu erstellen, und dann rufen Sie uns sofort' ISO_DATE' darauf. –

+0

ohne die 'Parser' und' ISO_DATE' wird auch erhalten DateTimePareseException –

+1

Was ich sage ist, dass 'DateTimeFormatter.ofPattern (pattern) .ISO_DATE' ist äquivalent zu' DateTimeFormatter.ISO_DATE'. –

Antwort

3

Ich denke, es ist schon alles in den Kommentaren, so ist dies nur um zusammenzufassen.

(1) Ihre Formatmusterfolge ist korrekt. Sie müssen nur .ISO_DATE aus der folgenden Zeile löschen, so wird es:

  DateTimeFormatter Parser = DateTimeFormatter.ofPattern(pattern); 

(ISO_DATE nimmt zum Beispiel '2011-12-03 + 01: 00' oder '2011-12-03', ein Datum ohne Zeit mit oder ohne einen Offset von UTC, Sie haben nichts, um es hier zu verwenden, soweit ich das beurteilen kann.)

(2) Da Ihre Zeichenfolge weder Zeitzone noch Offset zu haben scheint, verwenden Sie LocalDateTime:

  LocalDateTime a = LocalDateTime.parse(aTime, Parser); 
      LocalDateTime b = LocalDateTime.parse(bTime, Parser); 

Wenn Sie Sommerzeit (DST) oder ähnliches nehmen müssen, i nto Konto beim Berechnen der Differenz, die Zeit nach dem Parsing konvertieren:

  ZoneId timeZone = ZoneId.systemDefault(); 
      ZonedDateTime a = LocalDateTime.parse(aTime, Parser).atZone(timeZone); 
      ZonedDateTime b = LocalDateTime.parse(bTime, Parser).atZone(timeZone); 

Bitte denken Sie zweimal über die Zeitzone für die Konvertierung zu verwenden, damit Sie sicher sind, das erwartete Ergebnis zu erhalten.

(3) Ein ChronoUnit von null funktioniert nicht. Ich weiß nicht, welche Sie bestimmt ist, so dass diese Option gerichtet eher zufällig:

  ChronoUnit unit = ChronoUnit.DAYS; 

Mit diesen drei Änderungen Ihre Methode gut auf meinem Computer ausgeführt wird. In einem Durchlauf bedruckt:

2016-06-28 22:29:44.700228 
365 

im gleichen Lauf es eine Reihe von 365 zurückgegeben.

1

bekomme ich die Antwort von Andreas (in Kommentaren) i diesen Code verwendet, um mein Ziel zu erreichen schließlich

static String getWatchTime(JSONObject aJson, JSONObject bJson) { 
    double difference = 0 ; 
    try { 
     String aTime = aJson.getString("time_utc_8"); 
     String bTime = bJson.getString("time_utc_8"); 

      String pattern = "yyyy-MM-dd HH:mm:ss.SSSSSS"; 
      DateTimeFormatter Parser = DateTimeFormatter.ofPattern(pattern).withZone(ZoneId.systemDefault()); 

      System.out.println(aTime); 


      ZonedDateTime a = ZonedDateTime.parse(aTime,Parser); 
      ZonedDateTime b = ZonedDateTime.parse(bTime,Parser); 

      System.out.println(a); 
      System.out.println(b); 
      //ChronoUnit unit = null ; 
      difference = ChronoUnit.MICROS.between(a, b); 


    } catch (JSONException e) { 
     e.printStackTrace(); 
    } /*catch (ParseException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }*/ 

    String t = difference +""; 
    return t; 

} 

ich nicht die Zeitzone festgelegt haben, so kann die Eingabe als String in ZonedDateTime nicht konvertieren . Und ich brauche die microssecond zu bekommen, damit ich verwende ChronoUnit.MICROS.between() Danke für Antworten

Verwandte Themen