Много съжалявам, но всички отговори досега са като цяло неверни. Отговорът е доста прост, но изисква да разделим пет точки:
- ДАТА =java.sql.Date, която е обвивка около java.util.Date, която е броят на милисекунди от епохата в часовата зона UTC. Така че това има година/месец/дата/часове/минути/секунди във фиксирана часова зона GMT+0 (UTC). Обърнете внимание обаче, че java.sql.Date настройва часовите компоненти на нула!
- TIMESTAMP =java.sql.TimeStamp, който е обвивка на компонент около Date, която добавя части от секунди, за да поддържа стандарта за SQL DATE. Този клас/тип не е подходящ или е необходим за този въпрос, но накратко има датата плюс часа.
- Базата данни съхранява обекти DATE, както са дефинирани (използвайки UTC като отместване от Java), но може преведете времето, ако е конфигурирано в базата данни да бъде в различна часова зона. По подразбиране повечето бази данни по подразбиране са към часовата зона на локалния сървър, което е много лоша идея. Дами, господа... ВИНАГИ съхранявайте обекти DATE в UTC. Прочетете...
- Часът в JVM и часовата зона трябва да са правилни. Тъй като обектът Date използва UTC, изчислява ли се изместване за времето на сървъра ви? Имайте предвид това със силната препоръка времето на сървъра да бъде настроено на GMT+0 (UTC).
- Накрая, когато искаме да изобразим DATE от базата данни (с помощта на JSF или каквото и да е), това трябва да бъде настроен да бъде GMT+0 часова зона и, ако се прави от горната страна на сървъра също ... вашите дати и часове ВИНАГИ ще бъдат последователни, референтни и всички добри неща. Всичко, което остава, е да изобрази времето и ТОВА е мястото, където потребителският агент (за уеб приложение например) може да се използва за превеждане на GMT+0 часа към „локалната“ часова зона на потребителите.
Резюме:Използвайте UTC (GMT+0) на сървъра, в базата данни, във вашите Java обекти.
DATE и TIMESTAMP се различават само от гледна точка на базата данни по това, че TIMESTAMP носи допълнителни части от секунди. И двете използват GMT+0 (подразбиращо се). JodaTime е предпочитана календарна рамка за справяне с всичко това, но няма да реши проблемите с несъответствието на JVM с настройките на часовата зона на базата данни.
Ако дизайните на приложения от JVM до DB не използват GMT, поради лятно часово време, настройки на часовника и всякакви други регионални игри, които се играят в световните местни часовници ... времената на транзакциите и всичко останало ще бъдат завинаги изкривени , нереферентни, непоследователни и др.
Друг добър свързан отговор за типовете данни:java.util .Дата срещу java.sql.Date
Също така имайте предвид, че Java 8 има актуализации с по-добра обработка на дата/час (най-накрая), но това не коригира часовника на сървъра, на който работи JVM, да е в една часова зона, а базата данни да е в друга. В този момент винаги има превод. Във всеки голям (интелигентен) клиент, с който работя, часовите зони на базата данни и JVM сървъра са настроени на UTC точно поради тази причина, дори ако операциите им се извършват до голяма степен в друга часова зона.