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

Jak změnit časové pásmo MySQL v databázovém připojení pomocí Java?

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.



  1. Sqlite Android Raw Query INSERT INTO nefunguje

  2. Opravy související s výkonem pro SQL Server 2012

  3. TDS Server – Použití příkazů Transact-SQL (T-SQL) pro práci s daty Salesforce na SQL Server

  4. Operátor SQL se nerovná (!=) pro začátečníky