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.