Ne peut pas convertir la chaîne de ZonedDateTime: DateTimeParseException
J'essaie de convertir la chaîne de JSON à ZonedDateTime comme
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 de 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 dates.
J'ai essayé SimpleDateFormat
mais il recevra le résultat de l'erreur, pour les moulins.
- Il n'a pas beaucoup de sens pour créer un
Parser
, puis appelez immédiatementISO_DATE
sur elle. - sans le
Parser
etISO_DATE
obtiendrez également DateTimePareseException - Ce que je veux dire c'est que
DateTimeFormatter.ofPattern(pattern).ISO_DATE
est équivalent àDateTimeFormatter.ISO_DATE
. - merci pour votre message , j'ai googlé le problème et de trouver une des solution est d'ajouter
ISO_DATE
, je vais essayer une autre façons - Votre chaîne d'entrée ne contient pas les informations de fuseau horaire, de sorte que vous devez analyser à
LocalDateTime
, pasZonedDateTime
. Vous pouvez également spécifier un fuseau horaire par défaut sur l'analyseur, mais je vous suggère l'analyse deLocalDateTime
. Vous pouvez toujours faire appel àatZone(ZoneId.systemDefault())
pour obtenir unZonedDateTime
, si c'est ce que vous avez vraiment besoin. - Votre chaîne,
2016-06-28 22:29:44.700228
, ne sont conformes au modèle de format de chaîne de caractères que vous utilisez. Qu'advient-il si vous supprimez simplement.ISO_DATE
? - Ensuite, l'appel de
unit.between(a, b)
juste après que vous avez initialiséunit
ànull
est lié à provoquer unNullPointerException
.
Vous devez vous connecter pour publier un commentaire.
Je pense que c'est déjà tout dans les commentaires, donc c'est juste pour résumer.
(1) Votre modèle de format de chaîne est correcte. Vous avez juste besoin de supprimer
.ISO_DATE
à partir de la ligne suivante, de sorte qu'il devient:(
ISO_DATE
accepte par exemple "2011-12-03+01:00" ou "2011-12-03", une date, sans temps, avec ou sans décalage UTC; avez vous rien de l'utiliser pour ici autant que je puisse en dire.)(2) Depuis votre chaîne semble avoir ni horaire ni de décalage, de l'utilisation
LocalDateTime
:Si vous avez besoin de prendre l'heure d'été (heure d'été) ou en compte dans le calcul de la différence, de convertir l'heure après l'analyse:
S'il vous plaît réfléchir à deux fois sur le fuseau horaire à utiliser pour la conversion de sorte que vous êtes sûr d'obtenir le résultat attendu.
(3) Un
ChronoUnit
denull
ne fonctionne pas. Je ne sais pas ce que vous voulait, cette option est choisie un peu au hasard:Avec ces trois changements de méthode s'exécute bien sur mon ordinateur. En un seul passage de l'imprimer:
Dans la même course qu'il a renvoyé une chaîne de
365
.je reçois la réponse par Andreas(en commentaire)
j'ai utilisé ce code pour atteindre mon objectif, enfin,
Je n'ai pas de définir le Fuseau horaire, ne peut donc pas les convertir en entrée une chaîne de ZonedDateTime.
Et j'ai besoin d'obtenir le microssecond , j'ai donc utiliser
ChronoUnit.MICROS.between()
Merci pour les réponses