sql >> Database >  >> RDS >> Mysql

UTC DATETIME-veld ophalen uit MySQL in Java wanneer de tijdzone van de server niet UTC is

Uw klant getDate() code ziet er correct uit voor zover het gaat. Ik denk dat je ook het MySQL Connector/J JDBC-stuurprogramma nodig hebt om de datums te behandelen die in de tabel zijn opgeslagen als UTC-datums, om een ​​valse tijdzoneconversie te voorkomen. Dit betekent het instellen van de effectieve tijdzone van de server, naast de tijdzone van de clientsessie en de kalender die worden gebruikt voor JDBC getTimestamp belt terwijl u bezig bent.

Bekijk de waarden die je in je mislukte bewering hebt gekregen en in welke richting de fout zich bevindt:

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

Wat je terugkreeg was 10:30 BST, dat is 9:30 GMT. Dit komt overeen met de database die die 10:30 in de tabel als een BST-waarde behandelt en deze oneigenlijk voor u converteert naar GMT, voordat u deze als een GMT-datum ontleedt. Dat is de tegenovergestelde richting van een GMT-waarde die onecht wordt geconverteerd naar BST.

Dit kan een JDBC-specifiek probleem zijn, omdat JDBC vereist dat tijdtijden worden omgezet naar de lokale zone. (Waar de MySQL C API dat niet doet, waarschijnlijk omdat de klassieke tijdtypes van C niet zonebewust zijn zoals Java.) En het moet weten uit welke zone het van converteert , ook. De MySQL TIMESTAMP type wordt altijd opgeslagen als UTC. Maar dat staat niet vermeld voor de DATETIME type. Ik denk dat houdt in dat MySQL DATETIME . gaat interpreteren kolomwaarden als zijnde in de tijdzone van de server. Die u noemde als ingesteld op BST, en dat komt overeen met de richting van de verschuiving die wordt weergegeven in uw beweringfoutbericht.

De time_zone sessievariabele die u instelt, vertelt de MySQL-server wat de tijdzone van uw clientcomputer is, maar het heeft geen invloed op wat de server denkt dat zijn eigen tijdzone is. Dat kan worden overschreven met de serverTimezone JDBC-verbindingseigenschap . Stel op uw verbinding de serverTimezone . in naar UTC, en zorg ervoor dat useLegacyDatetimeCode is uit. (En kijk door de andere zonegerelateerde eigenschappen als dat niet werkt.) Kijk of dat ervoor zorgt dat uw datums doorkomen als UTC met dezelfde kalenderveldwaarden als in de database.

Houd er rekening mee dat dit de interpretatie van andere DATETIME . gaat veranderen waarden in uw database:ze gaan er nu allemaal uitzien als UTC-datums (in de context van uw JDBC-verbinding). Of dat juist is, hangt af van hoe ze aanvankelijk werden bevolkt. Hoewel uw clientcode het gewenste gedrag zal vertonen, weet ik niet of dit systeem als geheel volledig consistent kan worden gedragen zonder de tijdzone van de server op UTC op serverniveau in te stellen. Kortom, als de zone niet is ingesteld op UTC, is deze niet volledig geconfigureerd voor het gewenste gedrag en loop je er omheen.



  1. SQLite NOT NULL-beperking

  2. MySQL relationele databases gebruiken op Ubuntu 9.10 (Karmic)

  3. PostgreSQL, bestaande tabel opnieuw configureren, primaire sleutel wijzigen in type=serial

  4. AUTONOMOUS_TRANSACTION