Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Strefy czasowe Java Date i MySQL timestamp

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?

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 .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Domyślna data MySQL() + 14 dni dla kolumny?

  2. Jak rozwiązać Mysql do mysql, ponieważ mam pewne problemy?

  3. MySQL w chmurze — migracja online z Amazon RDS do instancji EC2:część pierwsza

  4. Wyłączenie wiersza w MySQL

  5. Przechowywanie danych hierarchicznych (MySQL) na potrzeby marketingu rekomendacji