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
.
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);
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();
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.
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.
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.)
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"));
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
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!
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