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

Pobieranie pola UTC DATETIME z MySQL w Javie, gdy strefa czasowa serwera nie jest UTC

Twój klient getDate() kod wygląda poprawnie, o ile to możliwe. Myślę, że potrzebujesz również sterownika MySQL Connector/J JDBC do obsługi dat przechowywanych w tabeli jako daty UTC, aby uniknąć fałszywej konwersji strefy czasowej. Oznacza to ustawienie efektywnej strefy czasowej serwera, oprócz strefy czasowej sesji klienta i Kalendarza używanego przez JDBC getTimestamp dzwoni jak robisz.

Przyjrzyj się wartościom uzyskanym w nieudanej asercji i kierunku błędu:

expected:<Thu Apr 16 11:30:30 BST 2015> but was:<Thu Apr 16 10:30:30 BST 2015>

Otrzymałeś 10:30 BST, czyli 9:30 GMT. Jest to zgodne z bazą danych, która traktuje tę 10:30 w tabeli jako wartość BST i fałszywie konwertuje ją na GMT dla Ciebie, zanim przeanalizujesz ją jako datę GMT. To jest przeciwny kierunek, w którym wartość GMT jest fałszywie konwertowana na BST.

Może to być problem specyficzny dla JDBC, ponieważ JDBC wymaga przekonwertowania czasu na strefę lokalną. (Tam, gdzie API MySQL C tego nie robi, prawdopodobnie dlatego, że klasyczne typy czasowe C nie uwzględniają stref, tak jak Javy.) I musi wiedzieć, z jakiej strefy konwertuje z , również. MySQL TIMESTAMP typ jest zawsze przechowywany jako UTC. Ale to nie jest określone dla DATETIME rodzaj. myślę oznacza to, że MySQL zinterpretuje DATETIME wartości kolumn jako znajdujące się w strefie czasowej serwera. Które wspomniałeś jako ustawione na BST i jest to zgodne z kierunkiem przesunięcia pokazanego w komunikacie o błędzie asercji.

time_zone ustawiona zmienna sesji informuje serwer MySQL, jaka jest strefa czasowa komputera klienckiego, ale nie ma wpływu na to, co serwer uważa za swoją strefę czasową. Można to zmienić za pomocą serverTimezone Właściwość połączenia JDBC . W swoim połączeniu ustaw serverTimezone do UTC i upewnij się, że useLegacyDatetimeCode jest wyłączony. (I przejrzyj inne właściwości związane ze strefami, jeśli to nie zadziała). Sprawdź, czy dzięki temu Twoje daty przyjdą jako UTC z tymi samymi wartościami pól kalendarza, co w bazie danych.

Pamiętaj, że zmieni to interpretację innych DATETIME wartości w Twojej bazie danych:teraz wszystkie będą wyglądać jak daty UTC (w kontekście połączenia JDBC). To, czy to się zgadza, będzie zależeć od tego, jak zostały początkowo zaludnione. Chociaż twój kod klienta będzie zachowywał się tak, jak chcesz, nie wiem, czy ten system jako całość może zachowywać się w pełni spójnie bez ustawiania strefy czasowej serwera na UTC na poziomie serwera. Zasadniczo, jeśli nie ma swojej strefy ustawionej na UTC, nie jest w pełni skonfigurowany pod kątem pożądanego zachowania, a ty kręcisz się wokół niego.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wstaw zapytanie z wewnętrznym sprzężeniem

  2. jak wstawić wiele wartości w mysql i uniknąć duplikatów?

  3. Wstaw tam, gdzie nie istnieje — bez klucza podstawowego

  4. Czy możliwe jest wejście z DWÓCH zapętlonych pól tekstowych?

  5. wiele żądań do węzła express problem z synchronizacją mysql