Warum ist es möglich, ein Local Objekt in den ZonedDateTime.from() -Methode übergeben, wenn es nicht möglich ist, eine einfache Datetime zu analysieren?
Sowohl LocalDateTimeZonedDateTime und implementiert die Schnittstelle Temporal, genannt, die TemporalAccessor erstreckt.
Local ist Datum-Zeit ohne eine Zeitzone in dem Systemkalender ISO-8601, wie 2007-12-03T10: 15: 30
ZonedDateTime ist Datum-Zeit mit einer Zeitzone in der ISO -8601 Kalendersystem, wie 2007-12-03T10: 15: 30 + 01: 00 Europa/Paris.
Jetzt, wenn Sie die Implementierung der from(TemporalAccessor temporal)
Methode sehen, die die TemporalAccessor erwartet. Sowohl ZonedDateTime als auch LocalDateTime implementiert die Methode der Super-Schnittstelle TemporalAccessor (Temporal erweitert TemporalAccessor) es ist normal (polymorphes Verhalten), uns sowohl die lokale als auch die Zeitzone zu überlassen.
Code:
public static ZonedDateTime from(TemporalAccessor temporal) {
if (temporal instanceof ZonedDateTime) {
return (ZonedDateTime) temporal;
}
try {
ZoneId zone = ZoneId.from(temporal);
if (temporal.isSupported(INSTANT_SECONDS)) {
long epochSecond = temporal.getLong(INSTANT_SECONDS);
int nanoOfSecond = temporal.get(NANO_OF_SECOND);
return create(epochSecond, nanoOfSecond, zone);
} else {
LocalDate date = LocalDate.from(temporal);
LocalTime time = LocalTime.from(temporal);
return of(date, time, zone);
}
} catch (DateTimeException ex) {
throw new DateTimeException("Unable to obtain ZonedDateTime from TemporalAccessor: " +
temporal + " of type " + temporal.getClass().getName(), ex);
}
}
Jetzt sind wir um Ihr Problem zu kommen.
Sie übergeben LocalDateTime.parse("2016-08-31T23:00:59")
an die from(TemporalAccessor temporal)
Methode.Das Temporal ist also keine Instanz von ZoneDateTime, es kommt ZoneId zone = ZoneId.from(temporal)
;
So erhalten Sie den Fehler, da die LocalDateTime die Zeitzone nicht enthält.
Wie löst man das Problem?
Verwenden Sie die Zone Id mit dem ZonedDateTime
LocalDateTime ldt = LocalDateTime.parse("2016-08-31T23:00:59");
ZoneId zoneId = ZoneId.of("Europe/Paris");
ZonedDateTime zdt = ldt.atZone(zoneId);
GregorianCalendar gc = GregorianCalendar.from(zdt);
Mit JUnit-Test
@Test
public void test() throws Exception {
ZoneId zoneId = ZoneId.of("Europe/Paris");
GregorianCalendar.from(LocalDateTime.parse("2016-08-31T23:00:59").atZone(zoneId));
}
Sind Sie fragen, wie zu einem 'GregorianCalendar' zu konvertieren, oder fragen Sie, warum es Ihnen erlaubt, ein zu übergeben Implementierung der 'TemporalAccessor'-Schnittstelle und klagt nur im Runtime darüber? – RealSkeptic
GeorgianCalendar benötigt eine Zeitzone, also können Sie 'GregorianCalendar.from (ZonedDateTime.parse (" 2016-08-31T23: 00: 59 + 00: 00 "));' eine Zeitzone bereitstellen. 'ZonedDateTime.from' kann für verschiedene Eingabearten und die in javadoc genannten Arten fehlschlagen. – vsminkov
Das Diagramm, das die Konvertierungen von alten Datum-Uhrzeit-Klassen in java.time in [meine Antwort] (http://stackoverflow.com/a/36639155) in [Java ju.time.Dat konvertieren zu dem Typ java.time] zeigt ?] (http://stackoverflow.com/q/36639154) kann nützlich sein. Finden Sie auch Beispielcode, der in beide Richtungen konvertiert. –