useTimezone to starsze obejście. Zespół MySQL całkiem niedawno przepisał kod setTimestamp/getTimestamp, ale zostanie on włączony tylko wtedy, gdy ustawisz parametr połączenia useLegacyDatetimeCode=false i używasz najnowszej wersji konektora mysql JDBC. Na przykład:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false
Jeśli pobierzesz kod źródłowy mysql-connector i spojrzysz na setTimestamp, bardzo łatwo zobaczysz, co się dzieje:
Jeśli użyj starszego kodu czasu daty =false, wywoływana jest funkcja newSetTimestampInternal(...). Następnie, jeśli Kalendarz przekazany do newSetTimestampInternal ma wartość NULL, obiekt daty jest sformatowany w strefie czasowej bazy danych:
this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss", Locale.US);
this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
timestampString = this.tsdf.format(x);
Bardzo ważne jest, aby Kalendarz był pusty, więc upewnij się, że używasz:
setTimestamp(int,Timestamp).
... NIE ustawiajTimestamp(int,Timestamp,Calendar).
Powinno być teraz oczywiste, jak to działa. Jeśli utworzysz datę:5 stycznia 2011 3:00 rano w Ameryce/Los_Angeles (lub w dowolnej strefie czasowej) za pomocą java.util.Calendar i wywołaj setTimestamp(1, myDate), to przyjmie twoją datę, użyj SimpleDateFormat aby sformatować go w strefie czasowej bazy danych . Jeśli więc Twoja baza danych znajduje się w Ameryce/Nowym_Jorku, utworzy ciąg '2011-01-05 6:00:00' do wstawienia (ponieważ Nowy Jork wyprzedza LA o 3 godziny).
Aby pobrać datę, użyj getTimestamp(int) (bez kalendarza). Ponownie użyje strefy czasowej bazy danych do zbudowania daty.
Uwaga:Strefa czasowa serwera internetowego jest teraz całkowicie nieistotna! Jeśli nie ustawisz useLegacyDatetimecode na false, strefa czasowa serwera WWW będzie używana do formatowania, co powoduje dużo zamieszania.
Uwaga:
Możliwe, że MySQL narzekam, że strefa czasowa serwera jest niejednoznaczna. Na przykład, jeśli twoja baza danych jest ustawiona na używanie EST, może istnieć kilka możliwych stref czasowych EST w Javie, więc możesz wyjaśnić to dla mysql-connector, mówiąc dokładnie, jaka jest strefa czasowa bazy danych:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false&serverTimezone=America/New_York";
Musisz to zrobić tylko wtedy, gdy narzeka.