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

Načítání pole UTC DATETIME z MySQL v Javě, když časové pásmo serveru není UTC

Váš klient getDate() kód vypadá správně, pokud to jde. Myslím, že také potřebujete získat ovladač MySQL Connector/J JDBC pro zpracování dat uložených v tabulce jako data UTC, abyste se vyhnuli falešnému převodu časového pásma. To znamená, že kromě časového pásma klientské relace a kalendáře používaného pro JDBC getTimestamp nastavíte také efektivní časové pásmo serveru volá stejně jako vy.

Podívejte se na hodnoty, které jste získali ve svém neúspěšném tvrzení, a na to, kterým směrem je chyba:

expected:<Thu Apr 16 11:30:30 BST 2015> but was:<Thu Apr 16 10:30:30 BST 2015>

To, co jste dostali zpět, bylo 10:30 BST, což je 9:30 GMT. To je v souladu s tím, že databáze považuje 10:30 v tabulce za hodnotu BST a falešně ji převádí na GMT, než ji analyzujete jako datum GMT. To je opačný směr, než je hodnota GMT falešně převedena na BST.

To může být problém specifický pro JDBC, protože JDBC vyžaduje, aby byly časové časy převedeny na místní zónu. (Tam, kde to rozhraní MySQL C API nedělá, pravděpodobně proto, že klasické časové typy C si neuvědomují zóny jako Java.) A potřebuje vědět, z jaké zóny ze převádí , také. MySQL TIMESTAMP typ je vždy uložen jako UTC. Ale to není uvedeno pro DATETIME typ. Myslím to znamená, že MySQL bude interpretovat DATETIME hodnoty sloupce jako v časovém pásmu serveru. O kterém jste zmínili, že je nastaveno na BST, a to je v souladu se směrem posunu zobrazeným ve vaší chybové zprávě s tvrzením.

time_zone proměnná relace, kterou nastavíte, říká serveru MySQL, jaké je časové pásmo vašeho klientského počítače, ale neovlivňuje to, jaké je jeho vlastní časové pásmo serveru. To lze přepsat pomocí serverTimezone Vlastnost připojení JDBC . Na svém připojení nastavte serverTimezone na UTC a ujistěte se, že useLegacyDatetimeCode je vypnuto. (A prohlédněte si další vlastnosti související se zónou, pokud to nefunguje.) Podívejte se, zda to způsobí, že vaše data budou procházet jako UTC se stejnými hodnotami kalendářního pole jako v databázi.

Uvědomte si, že to změní výklad ostatních DATETIME hodnoty ve vaší databázi:všechny budou nyní vypadat jako data UTC (v kontextu vašeho připojení JDBC). Zda je to správné, bude záviset na tom, jak byly původně osídleny. I když váš klientský kód bude mít požadované chování, nevím, zda lze tento systém jako celek přimět k tomu, aby se choval plně konzistentně bez nastavení časového pásma serveru na UTC na úrovni serveru. V zásadě platí, že pokud nemá zónu nastavenou na UTC, není plně nakonfigurován pro chování, které chcete, a motáte se kolem něj.



  1. Jak vytvořit tabulku v MySQL

  2. Mysql rekurze?

  3. Aktualizace Flask-SQLAlchemy vytváří nový záznam v MySQL

  4. Jak mohu vložit seznam vrácený z dotazu pyodbc mssql do mysql prostřednictvím uložené procedury pomocí pymysql