Es tut mir sehr leid, aber alle bisherigen Antworten sind generell falsch. Die Antwort ist recht einfach, erfordert aber, dass wir fünf Punkte trennen:
- DATE = java.sql.Date, ein Wrapper um java.util.Date, der die Anzahl der Millisekunden seit der Epoche in der UTC-Zeitzone angibt. Dies hat also das Jahr/Monat/Datum/Stunden/Minuten/Sekunden in einer festen GMT+0 (UTC) Zeitzone. Beachten Sie jedoch, dass java.sql.Date die Zeitkomponenten auf Null setzt!
- TIMESTAMP = java.sql.TimeStamp ist ein Komponenten-Wrapper um Date, der Sekundenbruchteile hinzufügt, um den SQL DATE-Typ-Standard zu unterstützen. Diese Klasse/Typ ist nicht relevant oder erforderlich für diese Frage, aber kurz gesagt, dies hat das Datum plus die Zeit.
- Die Datenbank speichert DATE-Objekte wie definiert (mit UTC als Offset von Java), aber Mai die Uhrzeit übersetzen, wenn sie in der Datenbank für eine andere Zeitzone konfiguriert ist. Die meisten Datenbanken verwenden standardmäßig die Zeitzone des lokalen Servers, was eine sehr schlechte Idee ist. Meine Damen und Herren ... Speichern Sie DATE-Objekte IMMER in UTC. Lesen Sie weiter...
- Die Zeit in der JVM und die Zeitzone müssen stimmen. Da das Date-Objekt UTC verwendet, wird ein Offset für Ihre Serverzeit berechnet? Berücksichtigen Sie dies bei der dringenden Empfehlung, die Serverzeit auf GMT+0 (UTC) zu setzen.
- Schließlich, wenn wir das DATE aus der Datenbank (mit JSF oder was auch immer) rendern wollen, ist es sollte so eingestellt werden, dass die Zeitzone GMT+0 ist, und wenn dies auch vom Server aus geschieht ... werden Ihre Daten und Zeiten IMMER konsistent, referenzierbar und all die guten Dinge sein. Alles, was übrig bleibt, ist die Zeit zu rendern und das ist, wo der User-Agent (für eine Web-Anwendung zum Beispiel) pourrait verwendet werden, um die GMT+0-Zeit in die "lokale" Zeitzone des Benutzers zu übersetzen.
Zusammenfassung: Verwenden Sie UTC (GMT+0) auf dem Server, in der Datenbank und in Ihren Java-Objekten.
DATE und TIMESTAMP unterscheiden sich aus Sicht der Datenbank nur dadurch, dass TIMESTAMP zusätzliche Sekundenbruchteile enthält. Beide verwenden GMT+0 (implizit). JodaTime ist ein bevorzugtes Kalender-Framework, um mit all dem umzugehen, behebt aber nicht die Probleme von nicht übereinstimmenden JVM- und Datenbank-Zeitzoneneinstellungen.
Wenn Anwendungsdesigns von der JVM bis zur DB aufgrund von Sommerzeit, Uhrenanpassungen und allen möglichen anderen regionalen Spielen, die mit den lokalen Uhren der Welt gespielt werden, nicht GMT verwenden, werden die Zeiten von Transaktionen und allem anderen für immer verzerrt, nicht referenziell, inkonsistent usw. sein.
Eine weitere gute Antwort zu den Datentypen: java.util.Date vs java.sql.Date
Beachten Sie auch, dass Java 8 Updates mit besserer Datums-/Zeitbehandlung hat (endlich), aber das behebt nicht, dass die Serveruhr, auf der die JVM läuft, in einer Zeitzone und die Datenbank in einer anderen ist. An diesem Punkt findet immer eine Übersetzung statt. In jedem großen (intelligenten) Client, mit dem ich arbeite, sind die Zeitzonen der Datenbank und des JVM-Servers aus genau diesem Grund auf UTC eingestellt, auch wenn ihre Operationen größtenteils in einer anderen Zeitzone stattfinden.