Linux-Befehl zum Prüfen, wo und in welcher Richtung heute eine Sommerzeitumstellung stattfindet?

Linux-Befehl zum Prüfen, wo und in welcher Richtung heute eine Sommerzeitumstellung stattfindet?

Ich entwerfe derzeit eine Lösung zum Synchronisieren der Uhr eines Geräts. Jedes Mal, wenn das Gerät nach einem Ausschalten wieder eingeschaltet wird, zeigt seine Uhr genau „01:01“ an. Zum Synchronisieren dieses Geräts habe ich einen NEXA-Fernschalter und ein Telldus Duo. Das Telldus Duo ist mit einem Server verbunden, der ein NTP-Server mit GPS- und PPS-Quelle ist.

Nun zum Problem: Derzeit wird die Uhr synchronisiert, indem einfach der Strom um 01:00 Uhr abgeschaltet und dann um 01:01 Uhr wieder eingeschaltet wird, wodurch die Uhr auf dem Gerät immer richtig geht.

Das Problem liegt jedoch an den Tagen der Sommerzeitumstellung. Wenn es einen Tag der Sommerzeitumstellung gibt, an dem die Uhr um 02:00 bis 03:00 Uhr um 1 Stunde VORGESTELLT werden soll, geht die Uhr des Geräts an einem ganzen Tag um 1 Stunde zurück. Wenn es einen Tag der Sommerzeitumstellung gibt, an dem die Uhr um 1 Stunde ZURÜCKGESTELLT werden soll, geht das Gerät 1 Stunde zu vor.

Daher muss ich an den Tagen mit Sommerzeitumstellung das Gerät so programmieren, dass es um 00:00 Uhr ausgeschaltet und um 00:01 Uhr eingeschaltet wird. Dann ist das Gerät auf 01:01 eingestellt, wenn die Uhr 00:01 anzeigt. Wenn die Uhr 02:00 anzeigt und auf 03:00 umgestellt wird, ist das Gerät bereits auf 03:00 eingestellt, sodass die Uhr nur 2 Stunden lang falsch angezeigt wird.

Und an den Tagen, an denen die Sommerzeit zurückgestellt wird, muss ich das Gerät so programmieren, dass es um 02:00 Uhr ausgeschaltet und um 02:01 Uhr eingeschaltet wird. Somit wird das Gerät 02:00 Uhr haben, wenn die Uhr 03:00 Uhr anzeigt und die Sommerzeit auf 02:00 Uhr zurückgestellt wird. In diesem Fall wird die Uhr des Geräts also nur 1 Stunde lang falsch sein.


Ich bin in der Lage, ein Skript zu schreiben, das dies erreicht, VORAUSGESETZT:

Ich kenne einen Befehl, der mir sagen kann, ob HEUTE der Tag ist, an dem eine Sommerzeitumstellung stattfindet, und in welche Richtung (02:00 auf 03:00 oder 03:00 auf 02:00) sie erfolgen wird.

Das bedeutet, dass ich entweder einen speziellen DST-Befehl brauche ODER die Möglichkeit, „in die Zukunft zu schauen“, z. B. „Wie sieht die Uhr aus, wenn ab jetzt 4 Stunden vergangen sind, unter Berücksichtigung der Sommerzeit?“. (Dann könnte ich prüfen, ob die Differenz zwischen der aktuellen und der zurückgesetzten Uhr 3 Stunden beträgt, dann ist es ein DST-BACK-Tag, 4 Stunden, dann ist es ein NO-DST-Tag und 5 Stunden, dann ist es ein DST-FORWARD-Tag.)

Hat jemand eine Idee für einen solchen Befehl?

Antwort1

Versuchen:

$ zdump -v Europe/London  -c $(date '+%Y'),$(date -d '+1 year' '+%Y') | awk -v y=$(date '+%Y') '$6==y && $15~1 {print $4, $3, $6}'
30 Mar 2014
26 Oct 2014

Hiermit werden die Daten gedruckt, an denen die Sommerzeit geändert wird. Ändern Sie sie Europe/Londonin Ihre Zeitzone.

Oder etwas länger:

$ zdump -v Europe/London  -c $(date '+%Y'),$(date -d '+1 year' '+%Y') | awk -v y=$(date '+%Y') '
                                     ($6==y && dst=="") {dst=$15}
                                     ($6==y && dst==$15) {ftime=$12; dst=$15;}
                                     ($6==y && dst!=$15) {print ftime, "to", $12, "on", $4, $3, $6, $15; dst=$15}'
00:59:59 to 02:00:00 on 30 Mar 2014 isdst=1
01:59:59 to 01:00:00 on 26 Oct 2014 isdst=0

Dadurch werden auch die Zeitänderungen gedruckt. Die letzte Spalte zeigt an, ob Sie in die Sommerzeit wechseln ( 1bedeutet, dass Sie in die Sommerzeit wechseln).

Antwort2

Wenn jemand über Google hierher gekommen ist und nach einem einfachen Befehl zur Sommerzeiterkennung für das Linux-Terminal sucht, reicht dies aus. Für die Frage des OP ist dies jedoch nicht komplex genug.

if perl -e 'exit ((localtime)[8])' ; then
    echo no DST
else
    echo DST
fi

*das 8. Element in der Ausgabe von localtime in Perl ist $isdsthttp://perldoc.perl.org/functions/localtime.html

Antwort3

Ich würde das System einfach fragen, wie es die Uhrzeit in genau 24 Stunden ausdrucken würde:

now=$(date +%H)
then=$(date -d '24 hours' +%H)
dst_change=$(( then - now ))

Achtung, führen Sie dies nicht pünktlich zur vollen Stunde aus …

verwandte Informationen