sql >> Databáze >  >> RDS >> Mysql

Problémy s časovým pásmem Java MySQL Timestamp

Jordane, vlastně jsi měl správný nápad. Problém je v tom, že je chyba v ovladači MySQL JDBC a argument Kalendář je ve výchozím nastavení zcela ignorován. Podívejte se na zdrojový kód pro PreparedStatement, abyste skutečně viděli, co se děje.

Všimněte si, že formát je Timestamp pomocí časového pásma JVM. To bude fungovat pouze v případě, že vaše JVM používá časové pásmo UTC. Objekt Calendar je zcela ignorován.

this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss''", Locale.US);
timestampString = this.tsdf.format(x);

Aby mohla MySQL používat argument Kalendář, musíte deaktivovat starší kód data/času pomocí následující možnosti připojení:

useLegacyDatetimeCode=false

Můžete jej tedy použít při připojování k databázi takto:

String url = "jdbc:mysql://localhost/tz?useLegacyDatetimeCode=false"

Pokud zakážete starší kód data a času pomocí výše uvedeného řádku, VYkreslí vaše časové razítko v časovém pásmu cílového kalendáře:

if (targetCalendar != null) {
    targetCalendar.setTime(x);
    this.tsdf.setTimeZone(targetCalendar.getTimeZone());

     timestampString = this.tsdf.format(x);
} else {
    this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
    timestampString = this.tsdf.format(x);
}

Je docela snadné vidět, co se tady děje. Pokud předáte objekt Calendar, použije to při formátování dat. V opačném případě použije k formátování dat časové pásmo databáze. Kupodivu, pokud zadáte kalendář, nastaví také čas na danou hodnotu časového razítka (což se zdá být zbytečné).



  1. SQL Buddy – Webový nástroj pro správu MySQL

  2. '𠂉' Není platný znak unicode, ale ve znakové sadě unicode?

  3. Šifrujte data v SQLite

  4. Vícerozměrné pole PHP MYSQL