sql >> Databáze >  >> RDS >> Mysql

JPA TemporalType.Date uvádí špatné datum

Je nám líto, ale všechny dosavadní odpovědi jsou obecně nesprávné. Odpověď je poměrně jednoduchá, ale vyžaduje, abychom oddělili pět bodů:

  1. DATE =java.sql.Date, což je obal kolem java.util.Date, což je počet milisekund od epochy v časovém pásmu UTC. Takže toto má rok/měsíc/datum/hodiny/minuty/sekundy v pevném časovém pásmu GMT+0 (UTC). Všimněte si však, že java.sql.Date nastavuje časové složky na nulu!
  2. TIMESTAMP =java.sql.TimeStamp, což je obal komponenty kolem Date, který přidává zlomky sekund pro podporu standardu typu SQL DATE. Tato třída/typ není pro tuto otázku relevantní ani potřebná, ale ve zkratce má datum a čas.
  3. Databáze ukládá objekty DATE, jak je definováno (používá UTC jako offset z jazyka Java), ale může přeložte čas, pokud je v databázi nakonfigurován tak, aby byl v jiném časovém pásmu. Ve výchozím nastavení většina databází používá časové pásmo místního serveru, což je velmi špatný nápad. Dámy, pánové... VŽDY ukládejte objekty DATE v UTC. Čtěte dále...
  4. Čas v JVM a časové pásmo musí být správné. Vzhledem k tomu, že objekt Date používá UTC, počítá se offset pro váš serverový čas? Zvažte to s důrazným doporučením, aby byl čas serveru nastaven na GMT+0 (UTC).
  5. Nakonec, když chceme vykreslit DATE z databáze (pomocí JSF nebo čehokoli jiného), mělo by být nastaven na časové pásmo GMT+0, a pokud to uděláte ze strany serveru, také ... vaše data a časy budou VŽDY konzistentní, referenční a všechny dobré. Zbývá pouze vykreslit čas a TOHLE je místo, kde by user-agent (například pro webovou aplikaci) mohl použít k převodu času GMT+0 do „místního“ časového pásma uživatele.

Shrnutí:Použijte UTC (GMT+0) na serveru, v databázi, v objektech Java.

DATE a TIMESTAMP se z pohledu databáze liší pouze tím, že TIMESTAMP nese další zlomky sekund. Oba používají GMT+0 (implicitně). JodaTime je preferovaný kalendářový rámec, který se s tím vším vypořádá, ale nevyřeší problémy s nesprávným nastavením JVM k databázovému časovému pásmu.

Pokud návrhy aplikací od JVM po DB nepoužívají GMT, kvůli letnímu času, úpravám hodin a všem druhům dalších regionálních her, které se hrají ve světě, místní hodiny ... časy transakcí a vše ostatní budou navždy zkreslené , nereferenční, nekonzistentní atd.

Další dobrá související odpověď o typech dat:java.util .Date vs java.sql.Date

Všimněte si také, že Java 8 má aktualizace s lepším zpracováním data/času (konečně), ale to neřeší, že serverové hodiny, na kterých běží JVM, jsou v jednom časovém pásmu a databáze v jiném. V tomto okamžiku vždy probíhá překlad. V každém velkém (chytrém) klientovi, se kterým pracuji, jsou časová pásma databáze a serveru JVM právě z tohoto důvodu nastavena na UTC, i když jejich operace z velké části probíhají v jiném časovém pásmu.



  1. Odkaz na tabulku v jiném schématu s vynecháním názvu schématu

  2. Jak přidám více než jeden řádek pomocí Zend_Db?

  3. Zkontrolujte typ parametru funkce oddílu v SQL Server (T-SQL)

  4. Sekvenční propustné rychlosti a posuvy