Unerwünschte Automatische Zeit-Zone Umrechnung Mit Hibernate/JPA und JDK Datum

Bin ich mit Hibernate (4.2) als mein provider, und ich habe eine JPA-Entität, die ein Datumsfeld enthält:

@Entity
@Table(name = "MY_TABLE")
public class MyTable implements Serializable {
  . . .
  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "START_DATE")
  private Date startDate;
  public Date getStartDate() {
    return startDate;
  }
  public void setStartDate(Date startDate) {
    this.startDate = startDate;
  }
  . . .
}

Die entsprechende Spalte START_DATE ist definiert als START_DATE TIMESTAMP (keine Zeitzone).

Ich bin mit Joda-Time (2.3) intern, um meine Anwendung zum Umgang mit dem Datum (immer in UTC), und kurz vor persistenten Entity, nutze ich die toDate() Methode der Joda ist DateTime - Klasse, um ein JDK Date Objekt, um zu gehorchen, die Zuordnung:

public void myMethod(DateTime startDateUTC) {
  . . .
  MyTable table = /* obtain somehow */
  table.setStartDate(startDateUTC.toDate());
  . . .
}

Wenn ich mir in der DB auf den Wert, der gespeichert ist, merke ich, dass irgendwo (JDK? Hibernate?) wandelt den Datumswert mithilfe der Standard-Zeitzone der JVM, wo der code ausgeführt wird. In meinem Fall ist, dass "Amerika/Chicago".

Das problem wirklich manifestiert sich in der Nähe der Sommerzeit (DST). Zum Beispiel, wenn die Zeit intern ist

2014-03-09T02:55:00Z

es wird gespeichert, wie

09-Mar-14 03:55:00

Was ich möchte, ist für ihn gespeichert werden

09-Mar-14 02:55:00

Jedoch in CDT, 2:55AM am 9. März nicht vorhanden ("Spring forward"). So etwas (JDK? Hibernate?) rollt das Datum.

Ich möchte für den Augenblick, die gespeichert wird in der DB werden in UTC. Nachdem alle, das ist, wie ich bin im Umgang mit it-intern für meine Anwendung, aber sobald ich die hand aus, um beibehalten werden, es wird umgewandelt zu meiner Standard-Zeit-zone.

Hinweis: ich bin nicht in der Lage, um den Standard-Zeitzone mit

TimeZone.setDefault(TimeZone.getTimeZone("UTC"))

, weil die JVM an, die bei mir läuft, ist von mehreren Anwendungen gemeinsam genutzt.

Wie Speichere ich das Datum im UTC-Format ohne Einstellung der JVM default-Zeitzone auf UTC?

  • Meine Vermutung ist, dass, wenn man sich das Datum in der Datenbank, die Werkzeug, das Sie verwenden, um es zu betrachten, verwandelt sich der binäre, numerische Darstellung des Datums, den die Datenbank verwendet intern in etwas, das Sie verstehen können: ein Datum und eine Uhrzeit formatiert, die Ihre Zeitzone aus. Genau wie wenn Sie new Date().toString(): die Zeitzonen-Agnostiker Date-Objekt formatiert eine Zeichenkette mit der Standard-Zeitzone.
Schreibe einen Kommentar