RTC Sommer / Winterzeit Umstellung

Gast #4470326
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.
Gast #4470334
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.
Gast #4470351
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.
#5365669
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)

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.