Seite 1 von 1
Sommer- / Winterzeit prüfen
Verfasst: Dienstag 14. Januar 2025, 21:13
von Knollo
Hallo in die Runde, ich muss prüfen ob ein Termin in der Sommer- oder Winterzeit liegt und hab dazu das kleine Script geschrieben:
Code: Alles auswählen
from PySide6.QtCore import QDateTime, QDate
def summer_winter_time(date):
years = date.year()
first_day = QDate(date.year(),1,1)
# Sommerzeitumstellung:
for i in range(31,25, -1):
summer_date = QDate(years,3,i)
if summer_date.dayOfWeek()==7:
break
days_to_summer = first_day.daysTo(summer_date)
# Winterzeitumstellung:
for i in range(31,25, -1):
winter_date = QDate(years,10,i)
if winter_date.dayOfWeek()==7:
break
days_to_winter = first_day.daysTo(winter_date)
days_to_date = first_day.daysTo(date)
if days_to_date > days_to_summer and days_to_date < days_to_winter:
print("Sommerzeit")
else:
print("Winterzeit")
if __name__ == "__main__":
date = QDate.fromString("2025-02-12" ,"yyyy-MM-dd")
summer_winter_time(date)
Das läuft auch soweit, ich muss nur noch die Uhrzeit einbinden - ABER: geht's auch einfacher?
Danke - Stefan
Re: Sommer- / Winterzeit prüfen
Verfasst: Dienstag 14. Januar 2025, 22:16
von Sirius3
Das ist nicht nur kompliziert sondern auch falsch. Wann welche Zeitumstellungen nötig sind, wird in Datenbanken gespeichert, weil es keine einfachen Regeln dafür gibt.
Code: Alles auswählen
from zoneinfo import ZoneInfo
ZONE_INFO = ZoneInfo("Europe/Berlin")
DAYLIGHT_SECONDS_TO_NAME = {
0: "Winterzeit",
3600: "Sommerzeit",
}
def get_daylight_name(datetime):
return DAYLIGHT_SECONDS_TO_NAME[ZONE_INFO.dst(datetime).seconds]
Re: Sommer- / Winterzeit prüfen
Verfasst: Dienstag 14. Januar 2025, 22:55
von Knollo
Hallo, läuft so:
Code: Alles auswählen
if __name__ == "__main__":
date = datetime.strptime("2025-11-12" ,"%Y-%m-%d")
print(get_daylight_name(date))
ich hatte mich an der Ansage orientiert:
...aber Dein Script ist wohl die bessere Lösung und läuft...
Danke
Re: Sommer- / Winterzeit prüfen
Verfasst: Mittwoch 15. Januar 2025, 08:18
von Sirius3
Wenn man wirklich die aktuell gültige Definition benutzen möchte:
Code: Alles auswählen
from datetime import datetime as DateTime, timedelta as TimeDelta
def daylight_saving(datetime):
last_of_march = DateTime(datetime.year,3,31,2,0)
delta_days = (last_of_march.weekday() + 1) % 6
start_summer_time = last_of_march - TimeDelta(days=delta_days)
last_of_october = DateTime(datetime.year,10,31,3,0)
delta_days = (last_of_october.weekday() + 1) % 6
end_summer_time = last_of_october - TimeDelta(days=delta_days)
return start_summer_time <= datetime <= end_summer_time
Die Gesetzeslage kann sich aber jederzeit ändern, und für die Vergangenheit war sie auch nicht immer gültig.
Das Problem ergibt sich aber gar nicht, weil man für alles, was mit Datum zu tun hat, konsequent mit Zeitzonen arbeiten sollte. Und dann erkennt man an der Differenz des UTC-Offsets zum normalen Offest, ob man Sommerzeit hat, oder nicht.
Code: Alles auswählen
from datetime import datetime as DateTime
from zoneinfo import ZoneInfo
ZONE_INFO = ZoneInfo("Europe/Berlin")
def main():
date1 = DateTime(2025, 3, 30, 4, 0, tzinfo=ZONE_INFO)
date2 = DateTime(2025, 3, 30, 1, 0, tzinfo=ZONE_INFO)
print(date1.utcoffset()) # 7200
print(date2.utcoffset()) # 3600
if __name__ == "__main__":
main()
Re: Sommer- / Winterzeit prüfen
Verfasst: Mittwoch 15. Januar 2025, 09:25
von __blackjack__
Oder man schaut sich das Ergebnis der `dst()`-Methode an ob das 0 ist oder nicht. Dann muss man nicht wissen welcher Wert der ”normale” für die Zeitzone ist.
Re: Sommer- / Winterzeit prüfen
Verfasst: Mittwoch 15. Januar 2025, 09:33
von Knollo
Danke für die ausführliche Antwort / Erklärung.
Stefan
Re: Sommer- / Winterzeit prüfen
Verfasst: Mittwoch 15. Januar 2025, 10:38
von __blackjack__
@Knollo: Zum Code im ersten Beitrag: `years` sollte `year` heissen und dann auch überall verwendet werden.
Das ermitteln vom letzten Sonntag steht zweimal im Code, das bietet sich für eine eigene Funktion an.
Ungetestet:
Code: Alles auswählen
def get_last_sunday(year, month):
for day in reversed(range(1, 32)):
date = QDate(year, month, day)
if date.dayOfWeek() == 7:
return date
assert False, "no sunday should not happen"
# Oder:
def get_last_sunday(year, month):
dates = (QDate(year, month, day) for day in reversed(range(1, 32)))
return next(date for date in dates if date.dayOfWeek() == 7)
def print_summer_winter_time(date):
first_day = QDate(date.year(), 1, 1)
days_to_summer = first_day.daysTo(get_last_sunday(date.year(), 3))
days_to_winter = first_day.daysTo(get_last_sunday(date.year(), 10))
days_to_date = first_day.daysTo(date)
print(
"Sommerzeit"
if days_to_summer <= days_to_date < days_to_winter
else "Winterzeit"
)
Re: Sommer- / Winterzeit prüfen
Verfasst: Mittwoch 15. Januar 2025, 15:48
von Knollo
hab grad noch 'ne Lösung gefunden:
Code: Alles auswählen
from PySide6.QtCore import QDateTime
date_1 = QDateTime.fromString("2025-03-30 01:00:00" ,"yyyy-MM-dd hh:mm:ss")
print(date_1.timeZoneAbbreviation())# Mitteleuropäische Zeit
date_2 = QDateTime.fromString("2025-03-30 04:00:00" ,"yyyy-MM-dd hh:mm:ss")
print(date_2.timeZoneAbbreviation())# Mitteleuropäische Sommerzeit
nun ja, das entspricht wohl fast dem Ergebnis der `dst()`-Methode.
Danke - Stefan