Odpowiedzi udzielone do tej pory aż do teraz skoncentrować się na szczegółach, które java.sql.Date
nie ma informacji o czasie. To prawda, ale nie jest to prawdziwy lub wystarczający powód, dla którego ten typ nie może zaoferować bezpośredniej konwersji na Instant
. Niestety błąd documentation of Java-8 powoduje, że ten sam błąd pozwala użytkownikom myśleć, że problem jest spowodowany brakującymi informacjami o czasie.
Pod względem koncepcyjnym typ java.sql.Date
reprezentuje typ lokalny. Modeluje datę kalendarzową, która może być inna w dowolnym regionie naszego globu. Ale Instant
jest taki sam na całym świecie. Użytkownicy potrzebują strefy czasowej lub strefy czasowej, aby wykonać konwersję.
Tragicznie typ java.sql.Date
dziedziczy po java.util.Date
, który jest typem globalnym (podobny do instant). Jednak to dziedziczenie naprawdę oznacza dziedziczenie implementacji, a nie dziedziczenie typu. Jeszcze jeden powód, aby rozważyć projekt tych starych klas JDBC, które mają zostać zerwane.Dlatego rzeczywiście jest możliwe użycie hacka do owinięcia java.sql.Date
za pomocą metody getTime()
wewnątrz instancji java.util.Date
, która ostatecznie umożliwia bezpośrednią konwersję w jednej chwili. Ale: Ta konwersja domyślnie używa domyślnej strefy czasowej systemu.
Jak poprawnie przekonwertować w sposób pedantyczny? Rozważmy documentation of Java-8 które ponownie tutaj wskazuje we właściwym kierunku:
java.sql.Date sqlDate = ...;
LocalDate calendarDate = sqlDate.toLocalDate();
ZonedDateTime zdt = calendarDate.atStartOfDay(ZoneId.of("Europe/Paris"));
Instant instant = zdt.toInstant();
Teraz pytanie brzmi: dlaczego został zaprojektowany w ten sposób. Można sobie wyobrazić, że jest domyślny, a czas ustawiony jest na 0. Nie można znaleźć niczego na liście mailingowej. – Tunaki
@Tunaki Logika sprawia, że myślę, że to dlatego, że klasa nadrzędna 'util.Date' ma publiczną metodę' toInstant', która nie powinna być używana przez klasę potomną. Więc zamiast robić "końcowy" (aby zachować logikę dziedziczenia), woleli opcję nadpisania go i uczynienia go bezużytecznym. –
@Tunaki prawdopodobnie dlatego, że jak zauważysz, każda konwersja na Instant wymagałaby arbitralnego ustawienia pewnych danych (czasu, strefy czasowej). – assylias