Gibt es eine Möglichkeit, ein Datum String
in LocalDateTime
zu konvertieren, wo das Format "yyyy-MM-dd"
ist?
Wenn ich das versuche:
DateTimeFormatter DATEFORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDateTime ldt = LocalDateTime.parse(string, DATEFORMATTER);
Ich habe diese Ausnahme bekommen:
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
Ich weiß, dass das Hauptproblem darin besteht, dass das Muster nicht die Stunde und die Minute enthält. Aber was ist, wenn ich eine Methode erstellen möchte, die eine String
und eine DateTimeFormatter
bekommt und ich mit LocalDateTime
zurückkehren möchte
Gibt es eine richtige, schöne Lösung?
BEARBEITEN:
Mein Ziel ist es, eine Methode zu erstellen, die eine String
und eine DateTimeFormatter
.__ abruft und mit einer LocalDateTime
..__ zurückgibt. Das Muster kann alles sein (was gültig ist).
Verwenden Sie LocalDate
, um ein localDate zu erstellen, und Sie können bei Bedarf das Timepart hinzufügen:
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);
oder LocalDateTime
ldt = LocalDateTime.of(ld, LocalDateTime.MIN.toLocalTime());
wenn Sie nur einen leeren Zeitabschnitt benötigen
BEARBEITEN:
Sehen Sie sich diese Lösung an, damit Sie Ihren dynamischen Parser erstellen können:
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);
Sie können "2017-03-13" nicht in eine LocalDateTime
konvertieren, da der String keine Zeitangaben enthält, nur das Datum. Sie können es in eine LocalDate
konvertieren.
DateTimeFormatter dateformatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate ld = LocalDate.parse("2017-03-13", dateformatter);
danach können wir es in LocalDateTime
umwandeln.
LocalDateTime ldt = ld.atStartOfDay();
Wie wäre es mit einem Liner?
LocalDateTime.parse("2017-03-13" + " 00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm"));
Für den Start des Tages können Sie verwenden:
LocalDate.parse("2017-10-18", DateTimeFormatter.ofPattern("yyyy-MM-dd"))
.atStartOfDay().atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ISO_DATE_TIME)
Für das Ende des Tages können Sie verwenden:
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)
Für localDateTime können Sie verwenden:
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'"))
Ergebnis:
2017-10-18T00:00:00Z
2017-10-18T23:59:59Z
2017-10-18T14:45:35Z