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!