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.