J'essaie simplement de convertir une chaîne de date en un objet DateTime dans Java 8. En exécutant les lignes suivantes:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);
J'obtiens l'erreur suivante:
Exception in thread "main" java.time.format.DateTimeParseException:
Text '20140218' could not be parsed:
Unable to obtain LocalDateTime from TemporalAccessor:
{},ISO resolved to 2014-02-18 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
La syntaxe est identique à ce qui a été suggéré ici , mais je suis servi avec une exception. J'utilise JDK-8u25
.
java
datetime
java-8
datetime-format
rétographie
la source
la source
LocalDate
et nonLocalDateTime
. Le problème était que j'avais créé monDateTimeFormatter
utilisation.withResolverStyle(ResolverStyle.STRICT);
, donc j'ai dû utiliser le modèle de dateuuuuMMdd
au lieu deyyyyMMdd
(c'est-à-dire "année" au lieu de "année de l'ère")!Si vous avez vraiment besoin de transformer une date en objet LocalDateTime, vous pouvez utiliser LocalDate.atStartOfDay (). Cela vous donnera un objet LocalDateTime à la date spécifiée, avec les champs heure, minute et seconde définis sur 0:
la source
LocalDateTime.from
semble inutile, commeatStartOfDay()
revient déjàLocalDateTime
.Pour ce qui vaut si quelqu'un devait relire ce sujet (comme moi), la bonne réponse serait dans la
DateTimeFormatter
définition, par exemple:Il faut définir les champs optionnels s'ils apparaissent. Et le reste du code devrait être exactement le même.
la source
parseDefaulting
APRÈS que vous avez appeléappendPattern
. Sinon, ça va céderDateTimeParseException
.Ceci est un message d'erreur vraiment peu clair et inutile. Après de nombreux essais et erreurs, j'ai trouvé que
LocalDateTime
cela donnerait l'erreur ci-dessus si vous n'essayez pas d'analyser une heure. En utilisant à laLocalDate
place, cela fonctionne sans erreur.Ceci est mal documenté et l'exception associée est très inutile.
la source
Élargissement de la réponse de la rétographie ..: J'ai eu ce même problème même en utilisant
LocalDate
et nonLocalDateTime
. Le problème était que j'avais créé monDateTimeFormatter
utilisation.withResolverStyle(ResolverStyle.STRICT);
, donc j'ai dû utiliser le modèle de dateuuuuMMdd
au lieu deyyyyMMdd
(c'est-à-dire "année" au lieu de "année de l'ère")!(Cette solution était à l'origine un commentaire à la réponse de la rétrospective, mais j'ai été encouragé à la publier comme une réponse autonome car elle fonctionne apparemment très bien pour de nombreuses personnes.)
la source
Pour tous ceux qui ont atterri ici avec cette erreur, comme moi:
Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}
Il provenait d'une ligne suivante:
Il s'est avéré que c'était parce que j'utilisais un modèle de 12 heures sur une heure 0, au lieu d'un modèle de 24 heures.
Changer le modèle d'heure en 24 heures en utilisant un H majuscule le corrige:
la source
Si la chaîne de date n'inclut aucune valeur pour les heures, les minutes, etc., vous ne pouvez pas la convertir directement en
LocalDateTime
. Vous ne pouvez le convertir qu'en aLocalDate
, car la chaîne ne représente que les composants année, mois et date , ce serait la bonne chose à faire.Quoi qu'il en soit, vous pouvez le convertir en
LocalDateTime
.la source
yyyy-mm-dd
il aurait dû l'êtreyyyy-MM-dd
.Essaye celui-là:
Vous pouvez ajouter le format de votre choix. Ça marche pour moi!
la source
Cela fonctionne bien
production:
la source