Die bisher gegebenen Antworten bis auf das Detail konzentrieren sich nun, dass java.sql.Date
keine Zeitinformationen hat. Das ist korrekt, aber nicht der tatsächliche oder ausreichende Grund, warum dieser Typ keine direkte Umwandlung in Instant
bieten kann. Unglücklicherweise macht der documentation of Java-8 den gleichen Fehler, um Benutzer denken zu lassen, das Problem sei nur wegen fehlender Zeitinformationen.
Konzeptionell entspricht der Typ java.sql.Date
einem lokalen Typ. Es modelliert ein Kalenderdatum, das in jeder Region unseres Globus unterschiedlich sein kann. Aber ein Instant
ist das gleiche auf unserem Globus herum. Benutzer benötigen also eine Zeitzone oder einen Zeitzonen-Offset, um die Konvertierung durchzuführen.
Tragischerweise erbt der Typ java.sql.Date
von java.util.Date
, die ein globaler Typ (Instant-like) ist. Diese Vererbung steht jedoch für die Implementierungsvererbung und nicht für die Typvererbung. Ein Grund mehr, das Design dieser alten JDBC-Klassen zu überdenken.Daher ist es in der Tat möglich, den Hack zu verwenden, um die java.sql.Date
über seine Methode getTime()
in eine Instanz von java.util.Date
zu verpacken, die schließlich direkte Umwandlung zu einem Augenblick erlaubt. Aber: Diese Konvertierung verwendet implizit die Standardzeitzone des Systems.
Also, wie man richtig auf pedantische Art und Weise konvertiert? Lassen Sie uns die documentation of Java-8 wieder betrachten hier die in die richtige Richtung:
java.sql.Date sqlDate = ...;
LocalDate calendarDate = sqlDate.toLocalDate();
ZonedDateTime zdt = calendarDate.atStartOfDay(ZoneId.of("Europe/Paris"));
Instant instant = zdt.toInstant();
Jetzt ist die Frage _why_ es wurde auf diese Weise entworfen. Man könnte sich vorstellen, dass es standardmäßig mit der Zeitangabe auf 0 gesetzt wird. Es gibt nichts in der Mailingliste. – Tunaki
@Tunaki Die Logik macht mich denken, dass es ist, weil die Elternklasse 'util.Date' eine öffentliche toInstant-Methode hat, die von der Kindklasse nicht verwendet werden sollte. Anstatt "final" zu machen (um die Vererbungslogik beizubehalten), bevorzugten sie die Option, sie zu überschreiben und unbrauchbar zu machen. –
@Tunaki wahrscheinlich, weil, wie Sie darauf hinweisen, jede Konvertierung in einen Instant würde einige Daten willkürlich setzen (Zeit, Zeitzone). – assylias