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

Jak zmienić strefę czasową MySQL w połączeniu z bazą danych za pomocą Javy?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MyISAM kontra InnoDB

  2. Wyjaśnienie MySQL IFNULL()

  3. Jak działa funkcja OCT() w MySQL

  4. 15 podstawowych pytań do rozmowy kwalifikacyjnej na temat MySQL dla administratorów baz danych

  5. Jak wykonać kopię zapasową/przywrócić MySQL/MariaDB i PostgreSQL za pomocą narzędzi „Automysqlbackup” i „Autopostgresqlbackup”