sql >> Databasteknik >  >> RDS >> Mysql

Hämtar UTC DATETIME-fältet från MySQL i Java när serverns tidszon inte är UTC

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.



  1. Använd OBJECTPROPERTY() för att ta reda på om en tabell är en systemtabell i SQL Server

  2. PHP MySQL Yii - databas som läser inte skriver

  3. Hur återställer jag en dumpfil från mysqldump med kubernetes?

  4. Välj skiftlägesokänslig med mysql, php och pdo