Sommerzeitumstellung (Funktion von jurs)

Guten Abend,

es gibt ja im Forum die Funktion von Jurs zur Sommerzeitumstellung.

Jurs schreibt in seinem Post, dass die Funktion in den Jahren von 2000 bis 2099 funktioniert.

Ich würde gerne verstehen warum die Funktion nur in dieser Zeitspanne funktioniert. Mit dem Jahr 2100 habe ich die Funktion schon probiert, und wie Jurs auch geschrieben hat funktioniert die Erkennung dann nicht mehr. Kann mir jemanden einen Tipp geben wo ich suchen muss um zu verstehen, warum es dann nicht mehr geht?

Ich weiß 2100 ist noch lange hin - es geht mir hierbei nur um das verstehen. Bin in Sachen Zeitrechnung nicht so fit..

byte tzHours = 0; // 0 = UTC / 1 = MEZ
boolean summertime_EU(int year, int month, int day, int hour, byte tzHours)
// European Daylight Savings Time calculation by "jurs" for German Arduino Forum
// input parameters: "normal time" for year, month, day, hour and tzHours (0=UTC, 1=MEZ)
// return value: returns true during Daylight Saving Time, false otherwise
{
  static int x1, x2, lastyear; // Zur Beschleunigung des Codes ein Cache für einige statische Variablen
  static byte lasttzHours;
  int x3;
  if (month < 3 || month > 10) return false; // keine Sommerzeit in Jan, Feb, Nov, Dez
  if (month > 3 && month < 10) return true; // Sommerzeit in Apr, Mai, Jun, Jul, Aug, Sep
  // der nachfolgende Code wird nur für Monat 3 und 10 ausgeführt
  // Umstellung erfolgt auf Stunde utc_hour=1, in der Zeitzone Berlin entsprechend 2 Uhr MEZ
  // Es wird ein Cache-Speicher für die Variablen x1 und x2 verwendet,
  // dies beschleunigt die Berechnung, wenn sich das Jahr bei Folgeaufrufen nicht ändert
  // x1 und x2 werden nur neu Berechnet, wenn sich das Jahr bei nachfolgenden Aufrufen ändert
  if (year != lastyear || tzHours != lasttzHours)
  { // Umstellungsbeginn und -ende
    x1 = 1 + tzHours + 24 * (31 - (5 * year / 4 + 4) % 7);
    Serial.print("x1 : "); Serial.println(x1);
    x2 = 1 + tzHours + 24 * (31 - (5 * year / 4 + 1) % 7);
    Serial.print("x2 : "); Serial.println(x2);
    lastyear = year;
    lasttzHours = tzHours;
  }
  x3 = hour + 24 * day;
  Serial.print("x3 : "); Serial.println(x3);
  if (month == 3 && x3 >= x1 || month == 10 && x3 < x2) return true; else return false;
}

void setup() {
  Serial.begin(115200);
  delay(200);
  Serial.println("\n\n");

  // Richtige Ausgabe von Normalzeit
  summertime_EU(2099, 3, 29, 0, 0) ? Serial.println("Sommerzeit") : Serial.println("Normalzeit");
  // Richtige Ausgabe von Sommerzeit
  summertime_EU(2099, 3, 29, 1, 0) ? Serial.println("Sommerzeit") : Serial.println("Normalzeit");

  // 28.3.2100 00:00:00 Uhr (UTC) -> Lokal 01:00:00 => Müsste also Normalzeit sein, es wird aber Sommerzeit angezeigt
  summertime_EU(2100, 3, 28, 0, 0) ? Serial.println("Sommerzeit") : Serial.println("Normalzeit");
  // 28.3.2100 01:00:00 Uhr (UTC) -> Lokal 02:00:00 => Wird als Sommerzeit ausgegeben
  summertime_EU(2100, 3, 28, 1, 0) ? Serial.println("Sommerzeit") : Serial.println("Normalzeit");

}

void loop() {
  // put your main code here, to run repeatedly:

}

Serielle Ausgabe:

x1 : 697
x2 : 601
x3 : 696
Normalzeit
x3 : 697
Sommerzeit
x1 : 649
x2 : 721
x3 : 672
Sommerzeit
x3 : 673
Sommerzeit

Vielen Dank und liebe Grüße!

Ich habe jetzt nicht genau geforscht, nur als Gedanke:
Evtl. wird 2100 als Schaltjahr nicht berücksichtigt.

Gruß Tommy

Das Jahr 2100 ist durch100 (ohne Rest) teilbar. (Säkularjahr) [edit] Siehe #4: Aber nicht durch 400 [/edit] Damit kein Schaltjahr.

Und auch nicht durch 400 (ohne Rest) teilbar darum kein Schaltjahr.
Grüße Uwe

Stimmt - ist irgendwie beim schnellen Schreiben untergegangen.. :wink:

1 Like

Ok, ich habe mich blöd ausgedrückt.
Wahrscheinlich ist ohne Berücksichtigung der 100/400 Jahres-Regel 2100 als Schaltjahr gerechnet worden.

Gruß Tommy

Eben. Nicht.
Wegen der Regel. Ist 2099 Schluß.

Welcher RTC funktioniert nach 2099 noch 100%?
Ich meine nicht elektrisch sondern funktionell daß die Daten richtig incrementiert werden und ein Datum nach 2099 eindeutig darstellbar sind.

Daß es uns alle 2099 nicht mehr gibt, sei in diesem Zusammenhang mal nicht berücksichtigt.

Grüße Uwe

Nee, nee, das ist ganz wichtig: Unsere (Ur-(Ur-))Enkel müssen doch Opas Spielzeuge in Ehren und am Laufen halten :wink:


Gruß Walter

Was kann ich noch gegen Ur-UR-Enkel sagen?
Grüße Uwe

Nichts, Schach matt. :rofl:
Nur bis 2100 sollte das Problem EU weit vom Tisch sein ... :thinking:

Guten Morgen.

Vielen Dank für eure Antworten. So kann ich versuchen meinen Ur-Ur-Enkeln meine Basteleien zu erhalten :grin:

Das mit den Schaltjahr Regeln habe ich jetzt soweit verstanden muss nur noch verstehen wie das in Jurs Formel eingebaut wurde.

Ich denke, dass das geteilt durch 4 in der Variable x1 und x2 eine Rolle spielt? Und dadurch 2100 als Schaltjahr erkannt wird. Deshalb funktioniert die Funktion noch mit dem Jahr 2000, weil es tatsächlich ein Schaltjahr war.

Müsste die Funktion dann nicht ab dem Jahr 2101 wieder funktionieren, weil es ja nicht als Schaltjahr erkannt wird?

Wenn ich nachher zu Hause bin, werde ich es testen.

Und vor allem versuchen die gesamte Berechnung zu verstehen, da sehe ich aktuell noch die größte Schwierigkeit :see_no_evil:

Liebe Grüße,
Björn

Optimist :wink:

Gruß Tommy

1 Like

Das sieht aber der Code auch nicht vor.
Es gibt kein Flag bezüglich Zeitumstellungsabschaffung.

Grüße Uwe

Ist der erste Hinderungsgrund nicht daß sie nicht wissen ob Sommerzeit oder Winterzeit die später Durchgängige Zeit sein wird?

Ja, aber warum muss das einheitlich sein in Europa? Ist doch eigentlich egal, wenn jeder seine eigene Festlegung trifft. Hauptsache es bleibt konstant.
Wenn sie es unbedingt einheitlich wollen, wird es bis 2100 wohl nicht gelöst sein.

Gruß Tommy

Hallo,

für einzelne Länder bzw. die Länder an den EU Randbezirken wäre eine eigene Wahlfreiheit bestimmt von Vorteil um die Sonnenstunden möglichst passend für sich zurechtzuschieben. Die UTC Zeitzonen sind ja fix. Aber wenn das jedes Land oder kleine Ländergruppen für sich festlegt, gibts zusätzlich zu den Zeitzonen weitere Korrekturstunden die nicht einheitlich sind. Ich denke dieses Kaos möchte man verhindern. Ich weiß nicht ob das am Ende zielführend ist. Man stelle sich einmal vor das Frankreich, Österreich und Polen alles abweichend von uns festlegen. Wäre auch nicht schön. Die EU denkt ja nicht nur an die Bürger im Land sondern auch an Grenzüberschreitenden Transport. Es soll ja in der EU einfacher werden und nicht komplizierter. Deswegen glaube ich das das Thema Zeitumstellung noch viele Jahre erhalten bleiben wird. Bis vielleicht jemand eine bessere Idee hat ...
Ich hatte mir das Anfangs auch einfacher vorgestellt.

Hallo,

du musst unterscheiden ob es um die Schaltjahrberechnung geht oder um die Umschaltzeitpunkte zwischen Sommer/Winterzeit. Das Schaltjahr betrifft nur den Monat Februar und ist damit völlig unabhängig von Sommer/Winterzeit. Nicht alles in einen Topf werfen.

jurs Programm dient "ja nur" dazu das man nicht immer die Zeit der RTC umstellen muss, sondern das das Programm es erledigt. Die Schaltjahrberechnung macht ja bis 2100 immer noch die RTC selbst. Die Daten kommen ja wie gesagt von der RTC. Ab 2100 bräuchte man neue RTC Schaltkreise.

Hallo Doc_Arduino,

dann war ich auf der falschen Spur. Ich dachte durch das Schaltjahr, was nicht richtig erkannt wird "verrechnet" sich jurs Funktion.

Unabhängig davon, dass die jetzigen RTC's ab 2100 nicht mehr funktionieren werden - habe ich es dann doch nicht verstanden warum die Funktion von jurs dann nicht mehr funktioniert.

Gruß,
Björn

Das glaube ich auch.
Wenn Schaltjahre falsch berechnet werden dann berechnet das Programm den Zeitintervall der gültigen Sommerzeit falsch und die Sommerzeit fängt nicht mehr am richtigen Sonntag an.
Die Schaltjahre bis 2099 müßten richtig berechnet werden und der Umschalttag.
laut Wikipedia.de:
"Die mitteleuropäische Sommerzeit beginnt am letzten Sonntag im März um 2:00 Uhr MEZ, indem die Stundenzählung um eine Stunde von 2:00 Uhr auf 3:00 Uhr vorgestellt wird. Sie endet jeweils am letzten Sonntag im Oktober um 3:00 Uhr MESZ, indem die Stundenzählung um eine Stunde von 3:00 Uhr auf 2:00 Uhr zurückgestellt wird."

Wenn sich durch den zuviel eingeschobenen Tag im Februar 2100 der letzte Sonntag um eine Woche verschiebt wird die Sommerzeit um eine Woche falsch angefangen und oder beendet. Das ist dann nicht für alle Jahre falsch sondern kommt auf die Kombination Woche und Wochentag im März / Oktober an. Der Fehler ist dann nicht immer vorhanden sondern sporadisch. Ich kann jetzt nicht berechnen wann das passiert. Ich schätze es passiert nur einigem male in dem Jahrhundert 2100 bis 2199.

Grüeß Uwe