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

JPA TemporalType.Dato giver forkert dato

Beklager meget, men alle svarene indtil videre er generelt forkerte. Svaret er ret enkelt, men kræver, at vi adskiller fem punkter:

  1. DATE =java.sql.Date, som er en indpakning omkring java.util.Date, der er antallet af millisekunder siden epoken i UTC-tidszonen. Så dette har år/måned/dato/timer/minutter/sekunder i en fast GMT+0 (UTC) tidszone. Bemærk dog, at java.sql.Date sætter tidskomponenterne til nul!
  2. TIMESTAMP =java.sql.TimeStamp, som er en komponentindpakning omkring Date, der tilføjer brøkdele af sekunder for at understøtte SQL DATE-typestandarden. Denne klasse/type er ikke relevant eller nødvendig for dette spørgsmål, men kort fortalt har denne dato plus klokkeslæt.
  3. Databasen gemmer DATE-objekter som defineret (bruger UTC som offset fra Java), men kan oversætte tiden, hvis den er konfigureret i databasen til at være i en anden tidszone. Som standard er de fleste databaser standard til den lokale server tidszone, hvilket er en meget dårlig idé. Mine damer, herrer ... Opbevar ALTID DATE-objekter i UTC. Læs videre...
  4. Tidspunktet i JVM og tidszonen skal være det rigtige. Da Date-objektet bruger UTC, beregnes en offset for din servertid? Overvej det med den stærke anbefaling om, at servertiden sættes til GMT+0 (UTC).
  5. Når vi endelig vil gengive DATO fra databasen (ved hjælp af JSF eller hvad som helst), bør det være sat op til at være GMT+0 tidszone, og hvis det gøres fra serveren op side også ... dine datoer og tidspunkter vil ALTID være konsekvente, refererende og alle gode ting. Det eneste, der er tilbage, er at gengive klokkeslættet, og DETTE er hvor brugeragenten (for en web-applikation for eksempel) kunne bruges til at oversætte GMT+0-tiden til brugerens "lokale" tidszone.

Oversigt:Brug UTC (GMT+0) på serveren, i databasen, i dine Java-objekter.

DATE og TIMESTAMP er kun forskellige fra et databaseperspektiv, idet TIMESTAMP bærer yderligere brøkdele af sekunder. Begge bruger GMT+0 (underforstået). JodaTime er en foretrukken kalenderramme til at håndtere alt dette, men løser ikke problemerne med uoverensstemmende JVM til databasens tidszoneindstillinger.

Hvis applikationsdesign fra JVM til DB ikke bruger GMT, på grund af sommertid, urjusteringer og alle slags andre regionale spil, der spilles i verdens lokale ure ... vil transaktionstiderne og alt andet for altid være skævt , ikke-refererende, inkonsekvent osv.

Et andet godt relateret svar om datatyper:java.util .Date vs java.sql.Date

Bemærk også, at Java 8 har opdateringer med bedre dato/tidshåndtering (endelig), men dette løser ikke, at serveruret, som JVM'en kører på, er i én tidszone og databasen i en anden. På dette tidspunkt sker der altid oversættelse. I hver store (smarte) klient, jeg arbejder med, er databasen og JVM-serverens tidszoner indstillet til UTC netop af denne grund, selvom deres operationer stort set foregår i en anden tidszone.



  1. Hvad er SQL Server Blocking?

  2. MySQL LN() Funktion – Returner den naturlige logaritme af et tal

  3. Returnerer Sqlalchemy forældede rækker?

  4. Forespørgsel efter element af array i JSON-kolonnen