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ů:
- 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!
- 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.
- 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...
- Č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).
- 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.