Din klient getDate()
koden ser korrekt ut så långt det går. Jag tror att du också måste skaffa MySQL Connector/J JDBC-drivrutinen för att behandla datumen lagrade i tabellen som UTC-datum, för att undvika en falsk tidszonsomvandling. Detta innebär att ställa in den effektiva servertidszonen, förutom klientsessionens tidszon och kalender som används för JDBC getTimestamp
samtal som du gör.
Ta en titt på värdena du fick i ditt misslyckade påstående och i vilken riktning felet är:
expected:<Thu Apr 16 11:30:30 BST 2015> but was:<Thu Apr 16 10:30:30 BST 2015>
Det du fick tillbaka var 10:30 BST, vilket är 9:30 GMT. Detta överensstämmer med att databasen behandlar den 10:30 i tabellen som ett BST-värde och falskt konverterar det till GMT åt dig, innan du analyserar det som ett GMT-datum. Det är den motsatta riktningen av ett GMT-värde som falskt konverteras till BST.
Detta kan vara ett JDBC-specifikt problem, eftersom JDBC kräver att tider konverteras till den lokala zonen. (Där MySQL C API inte gör det, förmodligen för att C:s klassiska tidstyper inte är zonmedvetna som Java är.) Och den måste veta vilken zon den konverterar från , också. MySQL TIMESTAMP
typ lagras alltid som UTC. Men det anges inte för DATETIME
typ. Jag tror som antyder att MySQL kommer att tolka DATETIME
kolumnvärden som i serverns tidszon. Vilket du nämnde är inställt på BST, och det stämmer överens med riktningen för skiftet som visas i ditt påståendefelmeddelande.
tidszonen
sessionsvariabeln du ställer in talar om för MySQL-servern vad din klientmaskins tidszon är, men den påverkar inte vad servern tror att dess egen tidszon är. Det kan åsidosättas med code>serverTimezone JDBC-anslutningsegenskap
. På din anslutning, ställ in serverTimezone
till UTC och se till att useLegacyDatetimeCode
är av. (Och titta igenom de andra zonrelaterade egenskaperna om det inte fungerar.) Se om det får dina datum att komma igenom som UTC med samma kalenderfältvärden som i databasen.
Var medveten om att detta kommer att ändra tolkningen av andra DATETIME
värden i din databas:de kommer alla att se ut som UTC-datum nu (i samband med din JDBC-anslutning). Om det är korrekt kommer att bero på hur de befolkades från början. Även om din klientkod kommer att ha det beteende du vill, vet jag inte om detta system som helhet kan fås att fungera helt konsekvent utan att ställa in serverns tidszon till UTC på servernivå. I grund och botten, om den inte har sin zon inställd på UTC, är den inte helt konfigurerad för det beteende du vill ha, och du klurar runt det.