PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timestamp werden irgendwie konvertiert!?



Cosh
02-01-2007, 12:56
Hallo!

Ich bin am verzweifeln!
Mein Problem: Ich möchte einen Timestamp in eine Datenbank (mysql) schreiben.
Wie:

PreparedStatement ps = c.prepareStatement("INSERT INTO test SET date1 = ?, date2 = ?");
ps.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
ps.setTimestamp(2, new Timestamp(System.currentTimeMillis()));
ps.execute();

ResultSet rs = c.createStatement().executeQuery("SELECT * from test LIMIT 1");
rs.next();
System.out.println(rs.getTimestamp(1));
System.out.println(rs.getTimestamp(2));

> 2007-01-02 12:42:59.0
> 2007-01-02 12:42:59.0

Resultat: es ist auf meiner Uhr 13:42. Doch schreiben tut er 12:42 in die Datenbank und genau mit 12:42 kommt es wieder heraus.

ähmm.. hä? Also entweder macht er es konsequent und schreibt es als GMT Zeit in die DB (also 12:42 von mir aus) und konvertiert die Zeit dann wieder von GMT in die lokale Uhrzeit des Rechners zurück, oder er lässt die Konvertierung gleich ganz (was mit am liebsten wäre).
Das Problem dabei ist: Unter Windows konvertiert er nicht, unter Linux konvertiert er. Das nächste Problem ist: Unter Linux entwickel ich, unter Windows soll die Software eingesetzt werden. Das bedeutet: Das muss auf beiden Systemen funktionieren. Aber wie?

Son Kleckerkram geht mir auf die Palme.. wieso muss das immer son Krampf sein zwischen Windows und Linux :(

Waxolunist
03-01-2007, 10:43
Also die Zeitzonenproblematik ist nicht einfach und bestimmt kein Kleckerkram, was immer das heißen mag.

Zunächst einmal, was gibt den new Timestamp(System.currentTimeMillis()) aus?
Welche Uhrzeit ist denn auf Windows und welche auf Linux eingestellt?
Sind alle Zeiten synchron?

Als nächstes solltest du sowohl Timestamp als auch die Zeitzone speichern. Denn es ist 4 Uhr sagt grundsätzlich einmal nichts aus, solange ich nicht die Zeitzone dazu kenne. Schau dir vielleicht bei der Gelegenheit einmal das Projekt jodatime an.

Oder du setzt einen NTP-Server ein.

Cosh
03-01-2007, 11:30
Kleckerkram deswegen, weil ich eigentlich keine hochwissenschaftliche Anwendung schreibe sondern einfach nur von meinem eigenen PC Daten ganz einfach speichern möchte und dazu für jeden Datensatz ein bestimmtes Datum mit Uhrzeit benötige. Ohne irgendwelche Zeitzonenfummelei oder Konvertierungen. Einfach nur "Daten rein" und irgendwann wieder "Daten raus". Und Kleckerkram auch deswegen, weil ich mich schon wieder stundenlang wegen so ner Lapalie aufgehalten fühle. Am liebsten hätte ich schon nen Screenshot von meiner Uhr gespeichert wenn es so kompliziert ist :) Okay, Spass beiseite. Mich regt das immer bissl auf, wenn man eigentlich nur mal eben was haben will, das ganze aber schon wieder ausufert..

Okay:
Ich denke das Problem habe ich mehr oder weniger gestern noch gefunden am späteren Abend. Also new Timestamp(System.currentTimeMillis()) gab mir eine Stunde früher, als die Systemuhr wieder, die ich in KDE sehe. Unter Windows stimmt die Zeit mit der Windowsuhr überein. Das Problem liegt/lag wohl daran, dass unter Linux die Default-Zeitzone GMT und nicht GMT+1 ist. Mit dem Aufruf
TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin")); stelle ich sie explizit auf GMT+1 ein und das Problem hat sich damit erledigt. Es gibt wohl auch eine Umgebungsvariable unter Linux, die man für Java diesbezüglich setzen kann. Allerdings werde ich das ganz gewiss bei der nächsten Installation vergessen haben und so ist es sicher, dass es funktioniert :)

Danke für den Tipp mit jodatime. Werde ich mir auf jeden fall mal anschauen. Vielleicht nicht gerade wegen dem Programm, was ich zur Zeit schreibe, aber vielleicht für meine Arbeitsstelle, an der ich so ein ähnliches Problem auch schon hatte.

Viele Grüße,
Martin