sql >> Database teknologi >  >> RDS >> Mysql

Henter UTC DATETIME-feltet fra MySQL i Java, når serverens tidszone ikke er UTC

Din klient getDate() koden ser korrekt ud, så vidt den rækker. Jeg tror, ​​du også skal have MySQL Connector/J JDBC-driveren til at behandle datoerne gemt i tabellen som UTC-datoer for at undgå en falsk tidszonekonvertering. Dette betyder indstilling af den effektive servertidszone ud over klientsessionens tidszone og kalender, der bruges til JDBC getTimestamp opkald, mens du laver.

Tag et kig på de værdier, du fik i din mislykkede påstand, og hvilken retning fejlen er i:

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

Hvad du fik tilbage var 10:30 BST, hvilket er 9:30 GMT. Dette er i overensstemmelse med, at databasen behandler den 10:30 i tabellen som en BST-værdi og falsk konverterer den til GMT for dig, før du analyserer den som en GMT-dato. Det er den modsatte retning af en GMT-værdi, der uretmæssigt konverteres til BST.

Dette kan være et JDBC-specifikt problem, fordi JDBC kræver, at tiderne konverteres til den lokale zone. (Hvor MySQL C API ikke gør, sandsynligvis fordi C's klassiske tidstyper ikke er zonebevidste, som Java er.) Og den skal vide, hvilken zone den konverterer fra , såvel. MySQL TIMESTAMP type gemmes altid som UTC. Men det er ikke angivet for DATETIME type. Jeg tror det antyder, at MySQL kommer til at fortolke DATETIME kolonneværdier som værende i serverens tidszone. Som du nævnte som værende indstillet til BST, og det stemmer overens med retningen af ​​skiftet, der vises i din påstandsfejlmeddelelse.

tidszonen sessionsvariablen, du indstiller, fortæller MySQL-serveren, hvad din klientmaskines tidszone er, men den påvirker ikke, hvad serveren tror, ​​dens egen tidszone er. Det kan tilsidesættes med serverTimezone JDBC-forbindelsesegenskab . På din forbindelse skal du indstille serverTimezone til UTC, og sørg for useLegacyDatetimeCode er slukket. (Og se de andre zonerelaterede egenskaber igennem, hvis det ikke virker.) Se om det får dine datoer til at komme igennem som UTC med de samme kalenderfeltværdier som i databasen.

Vær opmærksom på, at dette vil ændre fortolkningen af ​​andre DATETIME værdier i din database:de kommer alle til at ligne UTC-datoer nu (i forbindelse med din JDBC-forbindelse). Om det er korrekt kommer til at afhænge af, hvordan de oprindeligt blev befolket. Selvom din klientkode vil have den adfærd, du ønsker, ved jeg ikke, om dette system som helhed kan fås til at opføre sig fuldstændigt konsekvent uden at indstille serverens tidszone til UTC på serverniveau. Grundlæggende, hvis den ikke har sin zone indstillet til UTC, er den ikke fuldt ud konfigureret til den adfærd, du ønsker, og du roder rundt i den.



  1. Sådan opretter du CreatedOn og UpdatedOn ved hjælp af EF Core 2.1 og Pomelo

  2. En introduktion til TimescaleDB

  3. Brug af virtuelle felter i cakePHP 2.x

  4. Opdater alle rækker i en kolonne til ny værdi