web-dev-qa-db-fra.com

Impossible d'obtenir LocalDateTime de TemporalAccessor lors de l'analyse de LocalDateTime (Java 8)

J'essaie simplement de convertir une chaîne de date en objet DateTime dans Java 8. Lors de l'exécution des lignes suivantes:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);

Je reçois 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 à celle qui a été suggérée ici , mais je suis servi avec une exception. J'utilise JDK-8u25.

116
retrography

Il s'avère que Java n'accepte pas une valeur de date nue en tant que DateTime. Utiliser LocalDate au lieu de LocalDateTime résout le problème:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate dt = LocalDate.parse("20140218", formatter);
141
retrography

Si vous avez réellement 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:

final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime time = LocalDate.parse("20140218", formatter).atStartOfDay();
55
Øyvind Mo

Pour ce qui vaut la peine si quelqu'un doit relire ce sujet (comme moi), la réponse correcte serait dans la définition de DateTimeFormatter, par exemple:

private static DateTimeFormatter DATE_FORMAT =  
            new DateTimeFormatterBuilder().appendPattern("dd/MM/yyyy[ [HH][:mm][:ss][.SSS]]")
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
            .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
            .toFormatter(); 

Il faut définir les champs facultatifs s’ils apparaissent. Et le reste du code devrait être exactement le même.

40
Iulian David

Ceci est un message d'erreur très peu clair et peu utile. Après beaucoup d'essais et d'erreurs, j'ai trouvé que LocalDateTime donnera l'erreur ci-dessus si vous n'essayez pas d'analyser une heure. En utilisant LocalDate à la place, cela fonctionne sans erreur.

Ceci est mal documenté et l'exception associée est très inutile.

28
Tom B

Développer sur réponse de la rétrographie ..: J'ai eu le même problème même en utilisant LocalDate et non LocalDateTime. Le problème était que j'avais créé ma DateTimeFormatter avec .withResolverStyle(ResolverStyle.STRICT);, de sorte que je devais utiliser le modèle de date uuuuMMdd au lieu de yyyyMMdd (c'est-à-dire "année" au lieu de "année-année"). -ère")!

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
  .parseStrict()
  .appendPattern("uuuuMMdd")
  .toFormatter()
  .withResolverStyle(ResolverStyle.STRICT);
LocalDate dt = LocalDate.parse("20140218", formatter);

(Cette solution était à l'origine un commentaire pour la réponse de retrography, mais j'ai été encouragée à l'afficher en tant que réponse autonome, car elle fonctionne apparemment très bien pour de nombreuses personnes.)

18
ZeroOne

Pour tous ceux qui ont atterri ici avec cette erreur, comme je l’ai fait:

Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}

Cela venait d'une ligne suivante:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy h:mm"));

Il s’est avéré que c’était parce que j’utilisais un modèle 12 heures sur 0 heure au lieu de 24 heures.

Changer l'heure à 24 heures en utilisant un H majuscule le corrige:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy H:mm"));
15
mawburn

Si la chaîne de date n'inclut aucune valeur pour les heures, les minutes, etc., vous ne pouvez pas convertir cela directement en LocalDateTime. Vous ne pouvez le convertir qu'en LocalDate, car la chaîne niquementreprésente le année, mois et date les composants qu'il s'agirait du bonne chose à faire.

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf); // 2018-03-06

Quoi qu'il en soit, vous pouvez convertir ceci en LocalDateTime.

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf);
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00
10
prime

Essaye celui-là:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM-dd-yyyy"); 
LocalDate fromLocalDate = LocalDate.parse(fromdstrong textate, dateTimeFormatter);

Vous pouvez ajouter n'importe quel format que vous voulez. Ça marche pour moi!

1
Vinay Kasarla

Cela fonctionne bien

public class DateDemo {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm");
        String date = "16-08-2018 12:10";
        LocalDate localDate = LocalDate.parse(date, formatter);
        System.out.println("VALUE="+localDate);

        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
        LocalDateTime parse = LocalDateTime.parse(date, formatter1);
        System.out.println("VALUE1="+parse);
    }
}

sortie:

VALUE=2018-08-16
VALUE1=2018-08-16T12:10
1
Jeff Cook