2
votes

java.time.format.DateTimeParseException: impossible d'obtenir ZonedDateTime à partir de TemporalAccessor au format jjMMaaaahhmmss

J'ai des difficultés à formater une chaîne en ZonedDateTime.
Mon client veut avoir la date dans un format tel que jjMMaaaahhmmss, sans séparateurs ni trucs comme ça.
C'est ce que j'ai fait jusqu'à présent

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("ddMMyyyyhhmmss")
                          .toFormatter()
                          .withZone(ZoneId.systemDefault());

Bien qu'il produise correctement la chaîne, l'erreur se produit lors du processus d'analyse pour la création de la variable LocalDateTime

28032019100707

Exception in thread "main" java.time.format.DateTimeParseException: Text '28032019100707' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {MilliOfSecond=0, MinuteOfHour=7, HourOfAmPm=10, NanoOfSecond=0, MicroOfSecond=0, SecondOfMinute=7},ISO resolved to 2019-03-28 of type java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855)
    at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
    at MyClass.main(MyClass.java:14)
Caused by: java.time.DateTimeException: Unable to obtain ZonedDateTime from TemporalAccessor: {MilliOfSecond=0, MinuteOfHour=7, HourOfAmPm=10, NanoOfSecond=0, MicroOfSecond=0, SecondOfMinute=7},ISO resolved to 2019-03-28 of type java.time.format.Parsed
    at java.time.ZonedDateTime.from(ZonedDateTime.java:565)
    at java.time.format.Parsed.query(Parsed.java:226)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    ... 2 more
Caused by: java.time.DateTimeException: Unable to obtain ZoneId from TemporalAccessor: {MilliOfSecond=0, MinuteOfHour=7, HourOfAmPm=10, NanoOfSecond=0, MicroOfSecond=0, SecondOfMinute=7},ISO resolved to 2019-03-28 of type java.time.format.Parsed
    at java.time.ZoneId.from(ZoneId.java:466)
    at java.time.ZonedDateTime.from(ZonedDateTime.java:553)
    ... 4 more
Command exited with non-zero status 1


7 commentaires

En relation: Impossible d'obtenir ZonedDateTime de TemporalAccessor à l'aide de DateTimeFormatter et ZonedDateTime en Java 8


De plus, vous avez besoin de HH majuscules pour l'heure de la journée dans votre chaîne de modèle de format, comme dans cette question , par exemple.


@ OleV.V. Pensez-vous que cela est lié même si cela ne résout pas mon problème? Je demande juste pour que, la prochaine fois, je puisse éviter de créer une question similaire


Je pense que la question liée sous le marquage en double correspond mieux à la vôtre et devrait également avoir de grandes chances de résoudre votre problème. Voyez si ce n'est pas le cas et n'hésitez pas à faire un suivi ici.


@ OleV.V. J'ai essayé cela (si vous voyez dans ma question, il y a un DateTimeFormatBuilder qui a été partiellement pris à partir de là), c'est pourquoi j'ai ouvert une nouvelle question. Mais, comme l'a souligné YCF_L, tout ce dont j'avais besoin était d'utiliser directement ZonedDateTime depuis le début


C'est vrai: la chaîne ne contient pas suffisamment d'informations pour que ZonedDateTime puisse analyser la même valeur.


@ OleV.V. merci, cependant, d'avoir expliqué pourquoi vous l'avez marqué comme duplicata :)


3 Réponses :


1
votes

ddMMyyyyhhmmss ne contient aucune information de zone, ce n'est pas ZonedDateTime , il devrait être LocalDateTime .


2 commentaires

J'ai déjà essayé cette approche mais j'ai toujours la même erreur


@GianmarcoF. Je ne vois pas non plus pourquoi vous utiliseriez ZonedDateTime. Utilisation de String test = formatter.format (LocalDateTime.now ()). ToString (); LocalDateTime parsed = LocalDateTime.parse (test, formatter); fait exactement ce que vous avez demandé.



1
votes

Dans la chaîne que vous analysez, il n'y a aucune information sur TimeZone - alors comment le formateur devrait-il savoir comment passer en ZonedDateTime?

Vous devez soit avoir les informations TimeZone dans votre chaîne, soit utiliser un autre objet pour l'analyser dans lequel il n'y a pas d'informations TimeZone et ensuite les transférer dans la zone dont vous avez besoin.


4 commentaires

J'ai également essayé d'utiliser LocalDateTime mais j'obtiens toujours le même message d'erreur


@GianmarcoF. non, vous n'avez pas reçu le même message d'erreur. Le message d'erreur actuel indique explicitement qu'il manque des informations sur le fuseau horaire. Peu importe ce que vous dites, cela ne se produira pas si vous utilisez LocalDateTime. Si vous rencontrez des problèmes lors de l'utilisation de LocalDateTime, modifiez vos questions et affichez votre code exact et les résultats exacts.


Outre le problème de ne pas avoir d'informations de fuseau horaire, il est correct qu'il échoue également avec un LocalDateTime - mais cela est dû à l'utilisation de hh au lieu de HH dans le DateTimeFormatter (comme indiqué ci-dessus).


L'erreur, dans ce cas, venait du fait que hh n'était pas en majuscules et cela a causé l'erreur



2
votes

Vous voulez:

  String test = ZonedDateTime.now().format(formatter);


0 commentaires