Berechnung von Sommerzeit/Winterzeit in Micropython

Neulich wollt ich wo mal innerhalb eines (Micro)python-Scripts die aktuell politisch gültige Uhrzeit anzeigen, aka: Sommer- und Winterzeit berechnen. Auf der Suche nach ner Lösung bin ich im Micropython-Forum auf folgenden Schnipsel aus einem Posting von JumpZero gestoßen:

def cettime():
    year = time.localtime()[0]       #get current year
    HHMarch   = time.mktime((year,3 ,(31-(int(5*year/4+4))%7),1,0,0,0,0,0)) #Time of March change to CEST
    HHOctober = time.mktime((year,10,(31-(int(5*year/4+1))%7),1,0,0,0,0,0)) #Time of October change to CET
    now=time.time()
    if now < HHMarch :               # we are before last sunday of march
        cet=time.localtime(now+3600) # CET:  UTC+1H
    elif now < HHOctober :           # we are before last sunday of october
        cet=time.localtime(now+7200) # CEST: UTC+2H
    else:                            # we are after last sunday of october
        cet=time.localtime(now+3600) # CET:  UTC+1H
    return(cet)

Dit hat auch im März wunderbar geklappt. Wollt das nur mal kurz Teilen, Festhalten und hier Archivieren :) Die Mechanik dürfte beim Studieren schnell klar werden: Zunächst werden die beiden “Schalttermine” für das aktuell laufende Jahr bestimmt und denn geguckt ob “jetzt” vorm ersten, vorm oder nachm zweiten liegt und entsprechend für Mitteleuropa 1h, 2h, oder wieder doch nur 1h draufgeschlagen.

[Edit: Bitte sonst so beim “Datensammeln” auf Konsistenz im Zeitstrahl achten, also lieber einfach /keine/ Zeitumstellung vornehmen und vorzugsweise einfach innerhalb UTC bleiben. Hauptsache dranschreiben :)]

5 Likes

Hallo,

vielen Dank für die Funktion.
Kann mir aber jemand die Logik hinter der Formel erklären?
Ich möchte nur verstehen, wie man mit dieser Formel zu diesem Ergebnis kommt.

Wieso 5 * Jahr / 4 also ja eigentlich Jahr * 1,25?
Und wieso wird im März eine 4 dazu addiert und im Oktober eine 1?
Nennt mich Dummkopf, aber ich stehe hier völlig auf dem Schlauch.

Ich habe solche Berechnungen schon öfters in Excel gemacht. Dort habe ich mir aber einfach den Wochentag eines Datums geholt und dann bis zum gewünschten Wochentag zurückgerechnet.
Aber das hier???

Vielen Dank schon mal im Voraus.