Forum: Mikrocontroller und Digitale Elektronik RTC Sommer / Winterzeit Umstellung


von Robert (Gast)


Lesenswert?

Hallo,

ich weiß es wurde schon öfter besprochen, undzwar habe ich eine RTC ( im 
SIM900 GSM Modul ) die ich mit meinem AtMega32 abfrage.

Nun gibt es ja schon genug fertige Routinen, zur Erkennung ob Sommer 
oder Winterzeit ist.

Z.B.: 
https://electronicfreakblog.wordpress.com/2014/03/06/die-zeit-im-sommer-und-im-winter/

bzw:
1
boolean summertime_EU(int year, byte month, byte day, byte hour, byte tzHours)
2
// European Daylight Savings Time calculation by "jurs" for German Arduino Forum
3
// input parameters: "normal time" for year, month, day, hour and tzHours (0=UTC, 1=MEZ)
4
// return value: returns true during Daylight Saving Time, false otherwise
5
{
6
 if (month<3 || month>10) return false; // keine Sommerzeit in Jan, Feb, Nov, Dez
7
 if (month>3 && month<10) return true; // Sommerzeit in Apr, Mai, Jun, Jul, Aug, Sep
8
 if (month==3 && (hour + 24 * day)>=(1 + tzHours + 24*(31 - (5 * year /4 + 4) % 7)) || month==10 && (hour + 24 * day)<(1 + tzHours + 24*(31 - (5 * year /4 + 1) % 7)))
9
   return true;
10
 else
11
   return false;
12
}

Angenommen ich würde am 31.07.2016 um 23:11 (UTC+1) meinen µC 
einschalten, dann fragt er ab ob Sommerzeit ist, und erkennt, ja es ist 
Sommerzeit, rechnet eine Stunde dazu. Dann muss ich hier ja jetzt in 
Software wissen, dass auf den 31.7 der 01.08 folgt.

Muss ich es tatsächlich komplett ausprogrammieren, oder gibt es hier 
etwas komfortableres? Leider habe ich überall nur "hours+1" gefunden, 
und nirgends wurde näher darauf eingegangen.

von Werner (Gast)


Lesenswert?

Robert schrieb:
> Nun gibt es ja schon genug fertige Routinen, zur Erkennung ob Sommer
> oder Winterzeit ist.

Die hängen immer von der aktuell geltenden Sommerzeitverordnung (SoZV) 
ab.

Robert schrieb:
> Dann muss ich hier ja jetzt in Software wissen, dass auf den 31.7 der
> 01.08 folgt.

Ja, so ist das nun mal, wenn man nicht das Julianische Datum verwendet.

> Muss ich es tatsächlich komplett ausprogrammieren

Das Abklappern einer simplen Tabelle würde ich jetzt nicht hochtrabend 
als "ausprogrammieren" bezeichnen.

von Robert (Gast)


Lesenswert?

Werner schrieb:
> Robert schrieb:
>> Nun gibt es ja schon genug fertige Routinen, zur Erkennung ob Sommer
>> oder Winterzeit ist.
>
> Die hängen immer von der aktuell geltenden Sommerzeitverordnung (SoZV)
> ab.
>
> Robert schrieb:
>> Dann muss ich hier ja jetzt in Software wissen, dass auf den 31.7 der
>> 01.08 folgt.
>
> Ja, so ist das nun mal, wenn man nicht das Julianische Datum verwendet.
>

leider wahr ;).


>> Muss ich es tatsächlich komplett ausprogrammieren
>
> Das Abklappern einer simplen Tabelle würde ich jetzt nicht hochtrabend
> als "ausprogrammieren" bezeichnen.

ok, das dachte ich mir schon, wollte trotzdem die Profis fragen, Danke!
1
char sommer[6]={30,31,30,31,31,30};
2
3
if(summertime_EU(2000+year, month, day, hour, 1))
4
  {  hour++;
5
    if(hour>=24)
6
    {
7
      hour=0;
8
      day++;
9
      if(day>sommer[month-4])
10
      {
11
        day=1;
12
        month++;
13
      }
14
    }
15
  }

Habe das ganze jetzt so programmiert, funktioniert nach den ersten 
Tests, nur "ztHours" habe ich erstmal nicht beachtet.

von wendelsberg (Gast)


Lesenswert?

Wie immer: Kommt drauf an.

Der uebliche Ansatz bei "richtigen" Computern ist, die Zeit nur als UTC 
laufen zu lassen und diese nur fuer Anzeigen umzurechnen.

wendelsberg

von Peter D. (peda)


Lesenswert?


von Joachim B. (jar)


Lesenswert?

Robert schrieb:
> bzw:boolean summertime_EU

sagt mal rechnet der falsch?

der liefert in 2018, Oktober 2 Uhr schon Winterzeit dabei wird erst um 3 
Uhr zurückgestellt!

mein Code rechnet zumindest richtig!
Start!
2018/03/26_12:09:13 MESZ

2018/03/26_12:09:14 MESZ
-------
(2018, 3, 25, 1, 1) 01. MEZ
(2018, 3, 25, 2, 1) 02.MESZ
(2018, 3, 25, 3, 1) 03.MESZ
(2018, 10, 28, 1, 1) 04.MESZ
(2018, 10, 28, 2, 1) 05.MESZ
(2018, 10, 28, 3, 1) 06. MEZ
-------
06.MESZ
-------
2018/03/26_12:09:14 MESZ
1
boolean summertime_EU(uint16_t year, uint8_t month, uint8_t day, uint8_t hour, int8_t tzHours)
2
// European Daylight Savings Time calculation by "jurs" for German Arduino Forum
3
// input parameters: "normal time" for year, month, day, hour and tzHours (0=UTC, 1=MEZ)
4
// return value: returns true during Daylight Saving Time, false otherwise
5
{
6
/*
7
// !!!!!!!!!!! RECHNET falsch !!!!!!!!!!
8
  if (month<3 || month>10) return false; // keine Sommerzeit in Jan, Feb, Nov, Dez
9
  if (month>3 && month<10) return true; // Sommerzeit in Apr, Mai, Jun, Jul, Aug, Sep
10
  if (month==3 && (hour + 24 * day)>=(1 + tzHours + 24*(31 - (5 * year /4 + 4) % 7)) || month==10 && (hour + 24 * day)<(1 + tzHours + 24*(31 - (5 * year /4 + 1) % 7)))
11
    return true;
12
  else
13
    return false;
14
*/
15
// !!!!!!!!!!! RECHNET richtig !!!!!!!!!!
16
  uint8_t beginnMESZ = tagesnummer( year, 3, 31 );
17
  uint16_t endeMESZ = tagesnummer( year, 10, 31 );
18
//  uint8_t mo=month;
19
  uint16_t tij=tagesnummer(year, month, day);
20
  if(month > 2 && month < 11)        // 11, 12, 1 und 2 haben keine Sommerzeit
21
  { // auf Sommerzeit korrigieren
22
    while(wochentag_im_jahr(year, beginnMESZ) != 7)
23
      beginnMESZ--;
24
    while(wochentag_im_jahr(year, endeMESZ) != 7)
25
      endeMESZ--;
26
27
    if( tij>beginnMESZ && tij<endeMESZ )
28
      return true;
29
    else
30
    { if( tij==beginnMESZ && hour>=2  )
31
        return true;
32
      if( tij==endeMESZ && hour<3  )
33
        return true;
34
    }
35
  } // if(mo > 2 && mo < 11)
36
  return false;
37
} // boolean summertime_EU(uint16_t year, uint8_t month, uint8_t day, uint8_t hour, int8_t tzHours)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.