Alle Jahre wieder: die Zeitumstellung

Nachdem ich eigentlich dachte im VCR.NET Recording Service alles richtig gemacht zu haben, habe ich mich bei dem neuen Web Client nun doch wieder ausgetrickst und muss für 4.2 nachrüsten. Aber vielleicht an dieser Stelle kurz die Ursachen, die dem einen oder anderen helfen mögen nicht selbst in ähnliche Fettnäpfchen zu treten.

In der Web Oberfläche von VCR.NET wird die Dauer einer Aufzeichnung durch drei separate Parameter angegeben:

Zeitraum auswählen

Soll eine Aufzeichnung über Mitternacht erfolgen, so liegt die Startzeit nach der Endzeit und der Web Client kompensiert das dadurch, dass zum Startzeitpunkt 24 Stunden hinzugefügt werden. Bei einer Aufzeichnung in die Nacht hinein, in der die Umstellung stattfindet, aber mit einem Endzeitpunkt nach der Umschaltung liefert diese Rechnung entweder eine Stunde zu viel (da kann man mit leben) oder eine zu wenig (das ist dann übel). Ein Beispiel: die Aufzeichnung beginnt am 26. 10. 2013 um 23:00 und endet um 04:00 – das sind die drei Parameter, die der Anwender eingibt. Der Web Client hat nun erst einmal den Endzeitpunkt mit dem 26. 10. 2013 04:00 angenommen. Da dieser vor dem Start liegt wurden fälschlich 24 Stunden addiert, das gibt nur 27. 10. 2013 03:00 – schade, aber knapp daneben ist auch daneben.

Zudem wurde der Startzeitpunkt aus dem ausgewählten Datum plus der Startzeit berechnet. Das ausgewählte Datum liefert der DatePicker von jQueryUI bereits als JavaScript Date. Stellt man etwa eine Aufzeichnung vom 27. 10. 2013 von 20:00 bis 22:00 so ist dieses Datum der 27. 10. 2013 00:00 in der lokalen Zeitzone – also der 26. 10. 2013 22:00 GMT / UTC. Addiert man fehlerhaft nur 20 Stunden dazu, landet man durch die Umstellung auf 27. 10. 2013 19:00 – und verliert wieder eine Stunde der Aufzeichnung! Alle Aufzeichnungen, die mit dem bisherigen 4.1 Web Client für den Tag der Zeitumstellung nach der Umstellung gemacht wurden, beginnen bei gleicher Länge eine Stunde falsch!

Mangels besserer JavaScript / jQuery Kenntnisse verwendet VCR.NET 4.2 folgende Lösung: aus den Teilinformationen Jahr / Monat / Tag der lokalen Zeitzone des ausgewählten Datums und den festgelegten Uhrzeiten werden die Zeitpunkte für Start und Ende ermittelt. Liegt der Startzeitpunkt vor den Endzeitpunkt ist alles in Ordnung. Ansonsten wird nur der Tag im Endzeitpunkt mittels Date.setDate() um 1 erhöht. JavaScript führt hier nicht nur den notwendigen Sprung auf den nächsten Monat / das nächste Jahr aus, sondern berücksichtigt dabei auch die Zeitzone und verändert tatsächlich nur den Tag der lokalen Zeitzone.

Die Aufzeichnungsdauer wird dann korrekt aus der Differenz von End- und Startzeitpunkt ermittelt. Dass VCR.NET mit der Dauer und nicht dem Endzeitpunkt arbeitet ist eine Geschichte für einen anderen BLog Eintrag irgendwann später einmal…

Sorry an alle Zeitgeschädigten…

Jochen