useTimezone je starší řešení. Tým MySQL přepsal kód setTimestamp/getTimestamp poměrně nedávno, ale bude povolen pouze v případě, že nastavíte parametr připojení useLegacyDatetimeCode=false a používáte nejnovější verzi konektoru mysql JDBC. Takže například:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false
Pokud si stáhnete zdrojový kód mysql-connector a podíváte se na setTimestamp, je velmi snadné zjistit, co se děje:
Pokud použijete starší kód data a času =false, zavolá se newSetTimestampInternal(...). Pak, pokud má kalendář předaný newSetTimestampInternal hodnotu NULL, bude váš objekt data naformátován v časovém pásmu databáze:
this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss", Locale.US);
this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
timestampString = this.tsdf.format(x);
Je velmi důležité, aby byl Kalendář null – takže se ujistěte, že používáte:
setTimestamp(int,Timestamp).
... NOT setTimestamp(int,Timestamp,Calendar).
Nyní by mělo být jasné, jak to funguje. Pokud vytvoříte datum:5. ledna 2011 3:00 v Americe/Los_Angeles (nebo v jakémkoli časovém pásmu, které chcete) pomocí java.util.Calendar a zavoláte setTimestamp(1, myDate), pak to vezme vaše datum, použijte SimpleDateFormat naformátujte jej v časovém pásmu databáze . Pokud je tedy vaše DB v Americe/New_Yorku, vytvoří řetězec '2011-01-05 6:00:00', který se má vložit (protože NY je o 3 hodiny před LA).
Chcete-li získat datum, použijte getTimestamp(int) (bez kalendáře). Opět použije časové pásmo databáze k vytvoření data.
Poznámka:Časové pásmo webového serveru je nyní zcela irelevantní! Pokud nenastavíte useLegacyDatetimecode na hodnotu false, použije se pro formátování časové pásmo webového serveru, což přináší spoustu nejasností.
Poznámka:
Je možné, že si MySQL stěžuje, že časové pásmo serveru je nejednoznačné. Pokud je například vaše databáze nastavena tak, aby používala EST, může být v Javě několik možných časových pásem EST, takže to můžete objasnit pro mysql-connector tím, že mu přesně sdělíte, jaké je časové pásmo databáze:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false&serverTimezone=America/New_York";
Musíte to udělat pouze v případě, že si stěžuje.