tl;dr
myPreparedStatement
.setObject(
… , // Specify which placeholder `?` in your SQL statement.
OffsetDateTime.now( ZoneOffset.UTC ) // Capture the current moment as seen in the wall-clock time of UTC (an offset-from-UTC of zero).
) ;
Unikaj starszych klas data-godzina
Używasz okropnych klas daty i godziny, które lata temu zostały wyparte przez java.time zajęcia.
Nigdy nie używaj Date
lub Timestamp
.
UTC
Uchwyć aktualną chwilę w UTC. Większość baz danych przechowuje moment w UTC. Zasadniczo większość logiki biznesowej, debugowania, logowania, przechowywania i wymiany danych należy wykonywać w czasie UTC.
OffsetDateTime
Reprezentuj chwilę z przesunięciem od czasu UTC, używając trafnie nazwanego OffsetDateTime
klasa.
Chcemy samego UTC lub przesunięcie zera. Możemy użyć do tego stałej ZoneOffset.UTC
.
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ) ;
JDBC 4.2
Od JDBC 4.2 możemy bezpośrednio wymieniać java.time obiekty z bazą danych.
Aby zapisać ten moment w kolumnie typu danych podobnego do standardu SQL TIMESTAMP WITH TIME ZONE
:
myPreparedStatement.setObject( … , odt ) ;
Pobieranie:
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
ZonedDateTime
Aby zaprezentować użytkownikowi ten pobrany moment, możesz dostosować się do oczekiwanej/pożądanej strefy czasowej użytkownika.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
Nigdy nie polegaj na domyślnej strefie czasowej
Zauważ w powyższym kodzie, że zawsze określaliśmy pożądane/oczekiwane przesunięcie lub strefę.
Jeśli nie określisz, przesunięcie lub strefa są niejawnie stosowane. Lepiej jest wyraźnie określić swoje intencje jako bieżące domyślne ustawienia JVM, bazy danych i systemu operacyjnego hosta jako programista. Oznacza to, że kod oparty na wartościach domyślnych będzie się różnił zachowaniem w czasie wykonywania.
Jawa 6 i 7
Ten sam człowiek, Stephen Colebourne, który kieruje JSR 310 i java.time implementacja, a także słynny Joda-Time projekt, prowadzi również inny projekt, ThreeTen-Backport . Większość czasu java.time funkcjonalność jest przeniesiona do Javy 6 i 7 w tej bibliotece, z prawie identycznym API.
Więc wykonuj całą swoją pracę na zajęciach back-port. Następnie w ostatniej chwili przekonwertuj do/z java.sql.Timestamp
przez DateTimeUtils
klasa.
Te metody konwersji najczęściej używają Instant
przedmioty. Instant
to chwila w UTC, zawsze w UTC. Możesz dostosować z OffsetDateTime
do UTC, wyodrębniając Instant
. Instant
class to podstawowa klasa budulcowa w java.time , z OffsetDateDate
mając większą elastyczność, taką jak alternatywne wzorce formatowania podczas generowania ciągu. Ale zarówno Instant
i OffsetDateTime
reprezentują chwilę, punkt na osi czasu.
Instant instant = odt.toInstant() ;
java.sql.Timestamp ts = org.threeten.bp.DateTimeUtils.toSqlTimestamp( instant ) ;
Idąc w innym kierunku, pobierając Timestamp
z bazy danych, a następnie natychmiast przekonwertować na Instant
.
java.sql.Timestamp ts = myResultSet.getTimestamp( … ) ;
Instant instant = org.threeten.bp.DateTimeUtils.toInstant( ts ) ;
O java.time
java.time
Framework jest wbudowany w Javę 8 i nowsze. Te klasy zastępują kłopotliwe stare dziedzictwo
klasy data-godzina, takie jak java.util.Date
, Calendar
, &SimpleDateFormat
.
Joda-Time projekt, teraz w trybie konserwacji , zaleca migrację do java.time zajęcia.
Aby dowiedzieć się więcej, zapoznaj się z Samouczkiem Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Możesz wymienić java.time obiekty bezpośrednio z bazą danych. Użyj sterownika JDBC
zgodny z JDBC 4.2
lub później. Nie potrzeba ciągów, nie potrzeba java.sql.*
zajęcia.
Skąd wziąć zajęcia java.time?
- Java SE 8
, Java SE 9
, Java SE 10
, Java SE 11
i nowsze — część standardowego interfejsu Java API z dołączoną implementacją.
- Java 9 dodaje kilka drobnych funkcji i poprawek.
- Java SE 6
i Java SE 7
- Większość java.time funkcjonalność została przeniesiona do Javy 6 i 7 w ThreeTen-Backport .
- Android
- Późniejsze wersje pakietów Androida implementacji java.time zajęcia.
- W przypadku wcześniejszych wersji Androida (<26) ThreeTenABP projekt dostosowuje Backport ThreeTen (wspomniano powyżej). Zobacz Jak korzystać z ThreeTenABP… .
ThreeTen-Extra
projekt rozszerza java.time o dodatkowe zajęcia. Ten projekt jest poligonem doświadczalnym dla możliwych przyszłych dodatków do java.time. Możesz znaleźć kilka przydatnych klas, takich jak Interval
, YearWeek
, YearQuarter
i więcej
.