Zeitzonen

Hallo Community,

ich habe einen Java Prozess innerhalb einer Oracle Datenbank laufen. Leider teilt Oracle dem Prozess nicht die korrekte Zeitzone mit. Es ist auch nicht ersichtlich, ob es tatsächlich ein Konfigurationsproblem ist. Als Workaround prüfe ich nun, ob ich die Zeitzone händisch setzten kann. Dazu eine Frage: Wenn ich die Zeitzone auf “Europe/Berlin” stelle und wir haben genau jetzt eine Sommerzeitumstellung, berechnet Java dann die neue Zeit richtig? Woher weiß Java, ob es eine Zeitumstellung gab und ob es überhaupt eine gibt?

die Informationen zu Zeitumstellungen sind in Java hinterlegt,
das toString() einer Zeitzone gibt dafür schon ganz guten Eindruck:

sun.util.calendar.ZoneInfo[id="Europe/Berlin",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=143,
lastRule=java.util.SimpleTimeZone[id=Europe/Berlin,offset=3600000,dstSavings=3600000,useDaylight=true,
startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,
endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]]

(wieviel kürzer wäre das wenn endlich mal abgeschafft…)

funktioniert natürlich nur wenn diese Informationen auch noch stimmen, Russland hat etwa zuletzt ein wenig dynamisch geändert

As for Java, Oracle has issued JRE Time Zone patch “tzupdater-1_4_6-2014f” that contains Time Zone changes for Russia.

welche JVM in welchem Umfang in welcher Aktualität läuft ist die Frage bei deinem Oracle, aber man kann wohl von normal ausreichenden Stand ausgehen

wie Zeiten in der DB (oder zumindest in reinen Texten) gespeichert werden ist ja allgemein immer ein Problemchen, auch ohne Sommerzeit allein durch Zeitzonen,
13.03.2015 12:00 ist nicht besonders eindeutig, idealerweise Zeitzone hinten dran


jede Zeit und Berechnung in Java (hoffentlich auch DB ähnlich) ist grundsätzlich Millisekunden seit 1970,
die Zeitzone und Sommerzeit muss nur zur Darstellung berücksichtigt werden, dann freilich zu jeder Nutzung einzeln neu,
da gibt es keinen bestimmten Umstellungspunkt, ab dem Java paar Monate anders arbeitet

Danke für die Infos :slight_smile:

[quote=SlaterB]jede Zeit und Berechnung in Java (hoffentlich auch DB ähnlich) ist grundsätzlich Millisekunden seit 1970,
die Zeitzone und Sommerzeit muss nur zur Darstellung berücksichtigt werden, dann freilich zu jeder Nutzung einzeln neu,
da gibt es keinen bestimmten Umstellungspunkt, ab dem Java paar Monate anders arbeitet[/quote]

Hier ist aber mein Problem, dass ich mit Zeitstempeln aus der DB arbeite und mit dem aktuellen Zeitstempel innerhalb Java (new Date()). Wenn ich diese beiden Zeitstempel vergleiche und die Javazeit ist eine Stunde zurück, als der Datensatz, obwohl der Datensatz mit Sicherheit älter ist, dann habe ich ein unvorhergesehenes Verhalten in der Anwendung.

Aber gut: Zu meiner Frage zurück „Sommerzeitumstellung macht Java in der Darstellung automatisch“ ist die Antwort deinerseits dann „ja“. Somit könnte ich die Zeitzone DB spezifisch festlegen und im Code direkt setzen (setDefault()).

Wie wäre es denn, wenn Du Dir in deiner Java-Anwendung als erstes das Datum der DB holst, und dann gegen dieses vergleichst? Dann sparst Du Dir auch die Konvertierung von sql.Data zu util.Date…

bye
TT

So, wie sich das bei Dir liest (new Date()), bist Du immer noch mit den alten Zeitklassen unterwegs. Solltest Du Java 8 nutzen, dann schau Dir doch mal das hier an.

[quote=Hobelhai;113635]Solltest Du Java 8 nutzen[/quote]Der war gut!
Erzäh’l noch einen!
:lol:

bye
TT

Die Konvertierung spare ich mir nicht, da ich es eh schon in util.Date vorliegen habe … aber das wäre noch ein Ausweg, den ich auch schon ins Auge gefasst habe. Bedeutet aber einiges an Arbeit :(.

*** Edit ***

:slight_smile: ja genau

Zur Info, wer es nicht weiß: Ich muss noch mit Java 1.4 zurecht kommen (Oracle 10g). :slight_smile:

[QUOTE=freezly]
Zur Info, wer es nicht weiß: Ich muss noch mit Java 1.4 zurecht kommen (Oracle 10g). :)[/QUOTE]
Wusste ich nicht, danke.

[quote=freezly;113639]Bedeutet aber einiges an Arbeit[/quote]PreparedStatement theSysdate = connection.prepareStatement("select sysdate as actual_date from dual"); ResultSet rs=theSystdate.executeQuery(); rs.next(); return rs.getDate("actual_date");was noch?

bye
TT

Das ist nicht die große Arbeit :).
Ich muss ja alles durchschauen, wo das Datum benötigt wird. Und da geht es schon um ne ordentliche Handvoll Klassen.

[quote=freezly]Ich muss ja alles durchschauen, wo das Datum benötigt wird. Und da geht es schon um ne ordentliche Handvoll Klassen.[/quote]Ich denke, eclipse bekommt suchen nach regex „new +Date()“ und ersetzten durch „new MyDatabaseDate().get()“ recht gut hin. Anschließend zieht ++ auf allen Projekten die Imports gerade.

Aber ich kennen natürlich Dein Projekt nicht und bin da wohl etwas naiv…
:smiley:

bye
TT