Umschaltung von Sommer- auf Winterzeit



  • Hallo,

    letztes Wochenende war die Umschaltung von Sommer- auf Winterzeit. Dabei ist uns folgendes aufgefallen. In einem Programm (Java) werden Meldungen mit der aktuellen Uhrzeit verglichen. Es wird GregorianDate verwendet. Für Zeiten vor der Umschaltung die von der aktuellen Uhrzeit abgezogen werden, kommen negative Zahlen zustande.

    Es sieht so aus, als wenn die GregorianDate Klasse schon vor 3:00 die Zeiten in das Zeitintervall als zurücgesetzte Zeiten nach 3:00 erkennt.

    Jetzt meine Frage: Wie kann man erkennen, ob der Rechner (Windows) noch Sommerzeit hat, oder bereits auf Winterzeit umgestellt wurde. Die aktuell ermittelte Zeit ist immer richtig.



  • Guck in der Taskleiste auf die Uhr. Ist die Zeit richtig? Dann hat dein Windows die (Anzeige-)Zeit auf Winterzeit umgestellt. Oder du guckst in den Einstellungen nach der Zeitzone. Für Sommerzeit müsste sie MESZ gewesen sein, jetzt MEZ.

    Der Rechner müsste damit problemlos zurecht kommen, da er ja nicht die Zeit direkt manipuliert, sondern nur die angezeigte Zeit.



  • Sorry,

    die Rechnerzeit steht richtig, wie gesagt, die Ausgabe der aktuellen Zeit war vor und auch nach 3:00 ok. Es betrifft nur Meldungen zwischen 2:00 und 3:00. Die Uhrzeit ist und war immer richtig.

    Erst geht darum zu ermitteln, ob der Rechner (Windows) die Umschaltung der aktuellen Zeit bereits durchgeführt hat.



  • Die Zeit wird nicht verändert, sondern nur die angezeigte Zeit.



  • Ok

    intern wird mit UTC bzw. GMT gearbeitet.

    Meine Frage ist doch bloß, wie kann ich abfragen, ob der PC bereits von Sommer auf Winterzeit seine Darstellung geändert hat.



  • Augustus schrieb:

    Ok

    intern wird mit UTC bzw. GMT gearbeitet.

    Meine Frage ist doch bloß, wie kann ich abfragen, ob der PC bereits von Sommer auf Winterzeit seine Darstellung geändert hat.

    es wird 2 mal im jahr die zeit umgestellt... das sollte dein rechner auch machen, macht er normalerweise auch automatisch... 🙄
    ich verstehe die frage jetzt nicht ganz...

    nachvollziehen kannst du soetwas, entweder durch "zurückstellen der systemzeit und ausprobieren" oder alternativ schaust du mal ob es dazu logmeldungen gibt...
    z.B. Ereignisanzeige, oder i.welche Zeitlogs oder sowas...
    (evt. helfen dir auch logs von anderen programmen die auch die uhrzeit zur gefragen zeit abgefragt haben... so kannst du sehen ob es gestimmt hat oder nicht...)



  • Also Leute, ihr stellt euch echt wieder komisch an.
    Die Frage ist doch ziemlich klar.

    @Augustus
    Hier findest du nen Überblick über die Windows Funktionen die mit Zeit rummachen:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms724318(v=vs.85).aspx

    Eine Möglichkeit draufzukommen wäre:

    Hol dir die aktuelle Systemzeit als FILETIME ( GetSystemTimeAsFileTime ).
    Lass dir diese in die aktuell aktive lokale Zeitzone umrechnen ( FileTimeToLocalFileTime ).
    Bilde die Differenz und rechne diese in Minuten um.

    Dann hol dir mit GetTimeZoneInformation die Info über die aktuell eingestellte Zeitzone.
    Wenn die über GetSystemTimeAsFileTime ermittelte Differenz tzi.Bias + tzi.StandardBias entspricht, dann läuft der Rechner gerade mit Normalzeit.
    Wenn die Differenz tzi.Bias + tzi.DaylightBias entspricht dann läuft der Rechner gerade mit Sommerzeit.
    Wenn du gar keine Übereinstimmung hast, dann ist irgendwas komisch. Entweder wurde dann die Zeitzone gerade in dem Moment umgestellt wo dein Programm den Check gemacht hat. Oder ich hab die Doku falsch verstanden 😉

    Alternativ kannst du nur mit GetTimeZoneInformation bzw. arbeiten und selbst gucken ob das aktuelle Datum in den Sommerzeit-Bereich fällt oder nicht. Ist aber etwas lästig, da die Daten in der TIME_ZONE_INFORMATION Struktur nicht unbedingt absolute Daten sind. Gibt da auch so sachen wie "erster Samstag im Monat" oder "letzter Sonntag". Wäre mir zu lästig zu implementieren.
    Siehe
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx

    ps: Mir kommt das alles etwas zu kompliziert vor, hab aber keine einfachere Möglichkeit gefunden. Falls jemand eine kennt, bitte melden 🙂

    ps2: Normalerweise reicht es den aktuellen Bias zu kennen - egal wie dieser zu stande gekommen ist. Und wie du den bekommst hab ich ja schon beschrieben.



  • hustbaer schrieb:

    Also Leute, ihr stellt euch echt wieder komisch an.
    Die Frage ist doch ziemlich klar.

    Seh ich auch so. Aber eine Java-Frage mit Windows-API-Funktionen zu beantworten, hat auch das 😃

    @OP: Zum JDK gehört keine Klasse GregorianDate, sondern nur GregorianCalender - und die kümmert sich nur um das Datum, nicht um die Zeit. Nutzt Du irgendeine Library, die Du nicht erwähnt hast?

    Zum eigentlichen Problem: Für sowas kann ich nur die neue Java8-Zeit-API empfehlen. Nutze konsequent Instant (ausser, wenn es wirklich um die lokale Uhrzeit geht), und Du hast keine Probleme mit Zeitzonen und Zeitumstellungen.



  • Ich hab' leider keinen Plan von der Java Standard Library.
    Und da der OP "Windows" geschrieben hat... 😃



  • danke für die Antworten, wir haben inzwischen den Fehler gefunden. Die Klasse GegorianCalendar macht die Probleme.

    Wir verwenden jetzt JodaTime und es funktioniert.

    Ich selber bin hauptsächlich in C++ unterwegs und mit den Datums/Zeit-Klassen von Boost gab es garkeine Probleme.



  • Oh Mann!

    Jetzt wo ich diesen Thread lese fällt mir siedend heiß folgendes ein: Wir verdongeln unsere SW und damit niemand den Lizenzzeitraum verlängern kann schreiben wir den aktuellen Zeitstempel in den Dongel Speicher. Wenn wir eine Rückstellung bemerken, dann wird Dongle&SW gesperrt. Es hat sich aber niemand in letzter Zeit gemeldet das der Dongle gesperrt wurde. Vermutlich arbeiten die faulen Säcke nicht Vollzeit*g*



  • abcd schrieb:

    Vermutlich arbeiten die faulen Säcke nicht Vollzeit*g*

    Oder sie haben deine Dongles schon längst geknackt und brauchen sie nicht mehr 😛



  • @abcd
    Wenn das einer eurer schlauen Mitarbeiter programmiert hat, dann speichert & vergleicht eure Software UTC und erlaubt zusätzlich ein Zurückstellen von wenigen Minuten.



  • Ne ne kein Mitarbeiter, das war ich! Das muß so 2007 oder 2008 gewesen sein wo die SW verdongelt wurde. Es hat sich bisher aber niemand beschwert. Ich glaube zu der Nachtzeit am Wochenende wo das einmal im Jahr vorkommt, da sind die Kunden am Schlafen, deshalb ist dieser "Bug" bisher noch nie aufgetreten. Wegen Timerserver Update hatte ich eine Minute oder so Toleranz eingestellt, aber keine Stunde. Ich habe einfach nicht an die Zeitumstellung gedacht...


Log in to reply