# SimpleDateFormat und Zeitzone



## quaylar (12. Mrz 2010)

Hi alle,

Ich hab ein Verständnisproblem, was die Java Datentypen Date, TimeZone und SimpleDateFormat angeht.
Vielleicht kann mir hier jemand auf die Sprünge helfen:

Die Javadoc für Date gibt an, ein Date würde die Zeit immer in UTC repräsentieren, um in eine andere Zeitzone zu konvertieren kann ich einfach ein SimpleDateFormat nehmen, die Ziel-Zeitzone setzen und dann mit format() ausgeben.
Das funktioniert auch prima, nur wie realisiere ich das hier:

Ich hab in meiner Datenbank Timestamps in UTC stehen, diese lese ich über Hibernate aus und erhalte java.util.Date Objekte.
Ich möchte nun diese Daten in verschiedenen Zeitzonen ausgeben.
Sollte ja einfach gehen: Ein SimpleDateFormat mit der Ziel-Zeitzone (mal mit CET getestet, also UTC+1) erstellen und dann formatieren.
Tatsache ist aber, dass ich hier nicht einen Zeitstempel mit +1h zurückbekomme, sondern den ursprünglichen. Teste ich mit PST (UTC-8), erhalte ich einen Zeitstempel der 9h zurückliegt.

Ganz offensichtlich interpretiert SimpleDateFormat, das übergebene Datum als CET und nicht als UTC, also ist im Date doch irgendwie eine Zeitzone hinterlegt?

Kann irgendjemand Licht in die Sache bringen? Ich möchte, dass meine Zeitstempel als UTC interpretiert werden und davon ausgehend in andere Zeitzonen konvertiert werden...

lg,

--qu


----------



## SlaterB (12. Mrz 2010)

ein Date entspricht immer einen long-Wert Millisekunden seit 1970, 
finde den für ein problematisches Test-Datum heraus, wirf allen DB-Code weg,
erstelle ein neues Test-Programm, erstelle dort das Datum aus dem Milli-Wert und programmiere an Ausgaben was immer du da für ein Problem hast,
-> und poste das hier, dann kann man anfangen nachzudenken



---

kann es vielleicht etwas mit Sommer/ Winterzeit zu tun haben? 
dadurch gibt es in bestimmen Jahresabschnitten eine Stunde mehr oder weniger als in anderen,
die Zeitzonen rücken mal näher zusammen, mal weiter auseinander


----------



## quaylar (12. Mrz 2010)

Servus,

Vergiss den ganzen DB-Kram. Die zugrundeliegende Frage ist:

Ich hab Timestamps in UTC. Wie konvertier ich die in eine eine andere Zeitzone.

Simples Beispiel:


```
Date myDate = new Date();
SimpleDateFormat df = new SimpleDateFormat();
df.setTimeZone(TimeZone.getTimeZone("PST"));
df.format(myDate);
```

Erzeugt aktuelles Datum (sollte intern also in UTC gespeichert sein) und wandelt es dann in PST um (UTC-8, nachdem ich hier in Zeitzone UTC+1 bin, subtrahiert er 9h).

Soweit so gut. In meinem aktuellen Fall, will ich aber nicht, dass er myDate als UTC+1 interpretiert, sondern als UTC. Gibts dafür irgendeinen Weg?


----------



## SlaterB (12. Mrz 2010)

> Erzeugt aktuelles Datum (sollte intern also in UTC gespeichert sein) 

erzeugt ein Datum mit der jetztigen Zeit, so spät es eben gerade ist, das ist zeitzonenunabhängig, Date kennt keine Zeitzone,
es ist jetzt gerade 289123689blahblah Millisekunden nach einem bestimmten Startzeitpunkt und das war 1.1.1970 00:00 in London oder genausogut 2:00 in Berlin

> und wandelt es dann in PST um (UTC-8, nachdem ich hier in Zeitzone UTC+1 bin, subtrahiert er 9h).

das Date wird nicht umgewandelt, format liefert einen String zurück,

> In meinem aktuellen Fall, will ich aber nicht, dass er myDate als UTC+1 interpretiert, sondern als UTC.

wer interpretiert wen wann wo warum?
um die aktuelle gleiche Zeit in London zu erhalten formatiere das Date mit einem entsprechenden SimpleDateFormat zu einem String

eine andere Möglichkeit bietet ein Calendar, den kann man auch auf eine Zeitzone setzen,
wenn du dann die Zeit auf 19:00 einstellst ist es bei uns eine andere Zeit, je nachdem wie stark die Zeitzone abweicht,

oder du parst einen nur wenig spezifischen String "23:59" mit SimpleDateFormat zu einem Date,
dann kommt abhängig von der Zeitzone des SimpleDateFormats ein anderes Date raus,
irgendwo auf der Welt wirds schon passend 23:59 sein


----------



## quaylar (13. Mrz 2010)

Wenn ich meine Dates aus der DB, von denen ich weiß, dass sie in UTC vorliegen, in PST ausgeben lasse, dann subtrahiert Java 9h obwohl es eigentlich nur 8h subtrahieren sollte.
Java nimmt an, diese Daten wären CET (dann stimmts nämlich mit den 9h) und nicht UTC. Das ist mein Problem...


----------



## SlaterB (13. Mrz 2010)

das Datum aus der DB muss gewiss in irgendeiner Art interpretiert werden,
welche Mechanismen dazu einsetzt werden kann ich nicht näher beurteilen,
vielleicht kann man dort was ändern,

aber wenn nicht und wenn du dann ein Date erhälst, was 10:00 in UTC ist, 11:00 in CET und 2:00 irgendwo anders,
und hättest stattdessen lieber eins, welches 11:00 in UTC ist, 12:00 in CET und 3:00 woanders, also um eine Stunde abweichend,
dann ist das meiner Ansicht nach mit Interpretation oder Zeitzone nicht zu erreichen,
dann musst du das Date in einen Calendar stecken und eine Stunde drauf rechnen oder abziehen, was immer aktuell das Problem ist


----------

