Est-il possible de convertir une date String
en LocalDateTime
avec le format "yyyy-MM-dd"
?
Si j'essaye ceci:
DateTimeFormatter DATEFORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDateTime ldt = LocalDateTime.parse(string, DATEFORMATTER);
J'ai cette exception:
Java.time.format.DateTimeParseException: Text '2017-03-13' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {},ISO resolved to 2017-03-13 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.LocalDateTime.parse(LocalDateTime.Java:492)
at hu.npsh.workforce.utils.Util.stringToLocalDateTime(Util.Java:284)
at hu.npsh.workforce.utils.util.StringLocalDateTimeConversionTest.stringToLocalDateTimeTest(StringLocalDateTimeConversionTest.Java:35)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.Java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.Java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.Java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.Java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.Java:363)
at org.Eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.Java:86)
at org.Eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.Java:38)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:459)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:678)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.Java:382)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.Java:192)
Caused by: Java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: {},ISO resolved to 2017-03-13 of type Java.time.format.Parsed
at Java.time.LocalDateTime.from(LocalDateTime.Java:461)
at Java.time.format.Parsed.query(Parsed.Java:226)
at Java.time.format.DateTimeFormatter.parse(DateTimeFormatter.Java:1851)
... 26 more
Caused by: Java.time.DateTimeException: Unable to obtain LocalTime from TemporalAccessor: {},ISO resolved to 2017-03-13 of type Java.time.format.Parsed
at Java.time.LocalTime.from(LocalTime.Java:409)
at Java.time.LocalDateTime.from(LocalDateTime.Java:457)
... 28 more
Je sais que le problème principal, à savoir que le modèle ne contient pas l'heure et la minute ... Mais si je veux créer une méthode, ce qui donne une String
et une DateTimeFormatter
et je veux revenir avec LocalDateTime
Existe-t-il une solution correcte et agréable?
MODIFIER:
Mon objectif est de créer une méthode qui obtienne une String
et une DateTimeFormatter
Et retourne avec une LocalDateTime
. Le modèle peut être n'importe quoi (ce qui est valide).
Utilisez LocalDate
pour créer une date locale puis ajoutez le timepart si vous en avez besoin:
DateTimeFormatter DATEFORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate ld = LocalDate.parse("2017-03-13", DATEFORMATTER);
LocalDateTime ldt = LocalDateTime.of(ld, LocalDateTime.now().toLocalTime());
System.out.println(ldt);
ldt = LocalDateTime.of(ld, LocalDateTime.MIN.toLocalTime());
si vous avez juste besoin d'un timepart vide
MODIFIER:
Regardez cette solution avec cela, vous pouvez construire votre analyseur dynamique:
DateTimeFormatter DATEFORMATTER1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter DATEFORMATTER = new DateTimeFormatterBuilder().append(DATEFORMATTER1)
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter();
//DateTimeFormatter DATEFORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDateTime ldt = LocalDateTime.parse("2017-03-13", DATEFORMATTER);
Vous ne pouvez pas convertir "2017-03-13" en une LocalDateTime
car il n'y a pas d'informations temporelles dans la chaîne, mais uniquement la date. Vous pouvez le convertir en LocalDate
DateTimeFormatter dateformatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate ld = LocalDate.parse("2017-03-13", dateformatter);
après cela, nous pouvons le convertir en LocalDateTime
LocalDateTime ldt = ld.atStartOfDay();
Que diriez-vous d'un one-liner?
LocalDateTime.parse("2017-03-13" + " 00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm"));
Pour le début de la journée, vous pouvez utiliser:
LocalDate.parse("2017-10-18", DateTimeFormatter.ofPattern("yyyy-MM-dd"))
.atStartOfDay().atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ISO_DATE_TIME)
En fin de journée, vous pouvez utiliser:
LocalDate.parse("2017-10-18", DateTimeFormatter.ofPattern("yyyy-MM-dd"))
.atStartOfDay().plusHours(23).plusMinutes(59).plusSeconds(59).atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ISO_DATE_TIME)
Pour localDateTime, vous pouvez utiliser:
LocalDate.parse("2017-10-18", DateTimeFormatter.ofPattern("yyyy-MM-dd")).atTime(LocalTime.now())
.atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'"))
Résultat:
2017-10-18T00:00:00Z
2017-10-18T23:59:59Z
2017-10-18T14:45:35Z