2017-06-11 6 views
-2

je tente de convertir la chaîne de JSON à ZonedDateTime commeImpossible de convertir la chaîne à ZonedDateTime: 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; 

} 

et toujours obtenir l'erreur

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) 

Je veux obtenir la différence entre ces deux date. J'ai essayé SimpleDateFormat mais il obtiendra le résultat d'erreur, pour les usines.

+3

Il ne fait pas beaucoup de sens pour créer un 'Parser', puis appelez immédiatement' ISO_DATE' dessus. –

+0

sans 'Parser' et 'ISO_DATE' obtiendra également DateTimePareseException –

+1

Ce que je dis est que' DateTimeFormatter.ofPattern (pattern) .ISO_DATE' est équivalent à 'DateTimeFormatter.ISO_DATE'. –

Répondre

3

Je pense que c'est déjà tout dans les commentaires, donc c'est juste pour résumer.

(1) Votre chaîne de formatage est correcte. Vous avez juste besoin de supprimer .ISO_DATE de la ligne suivante, il devient:

  DateTimeFormatter Parser = DateTimeFormatter.ofPattern(pattern); 

(ISO_DATE accepte par exemple '2011-12-03 + 01: 00' ou '2011-12-03', une date sans avec ou sans décalage par rapport à l'UTC, vous n'avez rien à utiliser ici pour autant que je sache.)

(2) Comme votre chaîne ne semble avoir ni fuseau horaire ni décalage, utilisez LocalDateTime:

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

Si vous devez prendre le temps d'été (DST) ou similaire i Nto compte lors du calcul de la différence, convertir le temps après l'analyse syntaxique:

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

S'il vous plaît réfléchir à deux fois le fuseau horaire à utiliser pour la conversion de sorte que vous êtes sûr d'obtenir le résultat escompté.

(3) Un ChronoUnit de null ne fonctionnera pas. Je ne sais pas lequel vous aviez l'intention, cette option est choisi un peu au hasard:

  ChronoUnit unit = ChronoUnit.DAYS; 

Avec ces trois changements votre méthode exécute bien sur mon ordinateur. Dans un essai il imprimé:

2016-06-28 22:29:44.700228 
365 

Dans le même terme, il a renvoyé une chaîne de 365.

1

i obtenir la réponse par Andreas (en commentaire) i utilisé ce code pour atteindre mon objectif finalement

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; 

} 

Je n'ai pas mis fuseauHoraire, donc ne peut pas convertir l'entrée en tant que chaîne à ZonedDateTime . et je dois obtenir le microssecond, d'où j'utilise ChronoUnit.MICROS.between() Merci pour les réponses