Zeitzone serialisierte Dates

boskop

Aktives Mitglied
Ich hab ein Problem, wo ich absolut nicht durchblicke. Ich schicke serialisierte Objekte übers Netz, darunter auch Dates. Bei Mir auf dem PC kommt das Date richtig an:

Wed Jul 23 00:00:00 CEST 1978

Auf einem anderen Rechner bekomm ich nach dem deserialisieren folgendes:

Tue Jul 22 23:00:00 GMT+01:00 1980

Ich denke, das hat was mit der Sommerzeit zu tun.

Dates im Winter, Bsp: 23.12.1978 kommen auf beiden Maschinen richtig an. Nach 1980 kommt jedes Datum richtig an, egal ob Sommer oder Winter. Ich hab mich jetzt kurz schlau gemacht. 1980 wurde die Sommerzeit eingeführt.

Einer eine Idee, woher die Stunde verschiebung kommt und wie ich das beheben kann?

Gruss

Bosi
 
Zuletzt bearbeitet von einem Moderator:

AmunRa

Gesperrter Benutzer
Wie du beheben könntest wäre vl anstelle eines DateObjects eine Object vom Typ GregorianCalendar zu senden.

Woher diese Verschiebung kommt weiß ich selber auch nicht
 
S

SlaterB

Gast
die Ausgabe läßt darauf schließen, welche Zeitzone im Java-System als Default gesetzt ist,
das ist von Betriebssystemeinstellungen abhängig, kann zur Laufzeit oder bei Programmstart oder vielleicht generell für Java-Programme umgestellt werden

das Date wird gewiss als eindeutige Millisekunden-Anzahl seit 1.1.1970 00:00 in England übertragen, ist also eindeutig, wird nur unterschiedlich interpretiert,
wobei ich nicht ganz nachvollziehen kann wieso nach 1980 gleich und davor unterschiedlich, sicher damit?

hier ein Testprogramm mit den vermuteten Zeitzonen
Java:
public class Test
{
    public static void main(String[] args)
    {
        System.out.println("default: ");
        System.out.println(TimeZone.getDefault());
        System.out.println("tz1, 2: ");
        TimeZone tz1 = TimeZone.getTimeZone("GMT+01:00");
        TimeZone tz2 = TimeZone.getTimeZone("CET");
        System.out.println(tz1);
        System.out.println(tz2);

        Date d1 = new Date(75, 0, 1);
        Date d2 = new Date(75, 5, 1);
        Date d3 = new Date(85, 0, 1);
        Date d4 = new Date(85, 5, 1);
        TimeZone.setDefault(tz1);
        System.out.println(tz1.getDisplayName());
        System.out.println(d1);
        System.out.println(d2);
        System.out.println(d3);
        System.out.println(d4);
        TimeZone.setDefault(tz2);
        System.out.println(tz2.getDisplayName());
        System.out.println(d1);
        System.out.println(d2);
        System.out.println(d3);
        System.out.println(d4);
    }
}
Ausgabe:
Code:
default: 
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]]
tz1, 2: 
sun.util.calendar.ZoneInfo[id="GMT+01:00",offset=3600000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
sun.util.calendar.ZoneInfo[id="CET",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=137,lastRule=java.util.SimpleTimeZone[id=CET,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=7200000,startTimeMode=1,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=7200000,endTimeMode=1]]
GMT+01:00
Wed Jan 01 00:00:00 GMT+01:00 1975
Sun Jun 01 00:00:00 GMT+01:00 1975
Tue Jan 01 00:00:00 GMT+01:00 1985
Fri May 31 23:00:00 GMT+01:00 1985
Zentraleuropäische Zeit
Wed Jan 01 00:00:00 CET 1975
Sun Jun 01 00:00:00 CET 1975
Tue Jan 01 00:00:00 CET 1985
Sat Jun 01 00:00:00 CEST 1985
GMT+01:00 scheint keine Sommerzeit zu verwenden, wie man an 'useDaylight=false' erkennt, also eher früher mit CET übereinstimmend, später nicht mehr wenn letzteres Sommerzeit hat

ob die Dates auf beiden Systemen dieselben sind kann man mit Calendar prüfen wie AmunRa sagt, wobei der auch von Zeitzone abhängig ist,
oder Vergleich von getTime()
 

boskop

Aktives Mitglied
Ja das mit dem Datum 1980 stimmt. Vor 1980 sind auch nicht alle falsch, nur die, die in der Sommerzeitperiode liegen. Die im Winter stimmen auch.

Ich hab die Zeitzone nun beim Client versucht zu setzten mit -Duser.timzone. Hat aber nichts gebracht, ausser, dass die Logoutputs einen falschen Zeitstempel hatten;-)
 
S

SlaterB

Gast
besteht noch eine Frage?
wenn ja, dann bitte bisschen genauer vorgehen

> Hat aber nichts gebracht
was genau hat sich denn geändert oder nicht geändert, geht es um System.out.println-Ausgaben oder was anderes,
'die Logoutputs' sind anderes Ausgaben? die Ausgaben oder sonstige nicht näher benannte Verwendung der serialisierten Dates bleibt gleich oder was genau passiert denn exakt mit langen Sätzen beschrieben?

hast du die ms-Zeit der Dates verglichen?
 

Ähnliche Java Themen

Neue Themen


Oben