h1.jpg                                                                            

 

Nützliche Datums-Routinen:

Manchmal besteht das Verlangen, die Daten, welche ein einfacher RTC-Baustein liefert (z.B. bei Embedded Systems oft eingesetzt), für den Anwender etwas Komfortabler zu gestalten. So wäre es schön, wenn die Eingabestruktur für Uhrzeit und Datum die oft von einfachen RTC's nicht zur Verfügungung gestellte Funktionalität für den Letzten Wochentag im Monat (ist ja bekanntlich im Februar Schaltjahrabhängig) sowie die Berechnung des Wochentages in einfacher Weise dargeboten würde. Die einfachsten Methoden  welche ich bisher gefunden habe und selbst auch unentwegt einsetze sind im folgenden (hier der einfach heit halber in C) dargestellt:

1) Erkennen, ob ein Schaljahr vorliegt:

Listing 1:


BOOL IsSchaltjahr(int jahr)  // Rückgabewert: FALSE, wenn kein Schaltjahr,   TRUE, wenn Schaltjahr
{
  BOOL ret_value;

  if( jahr < 100 )         // viele RTC's stellen nur ein Byte für die Jahreszahl zur Verfügung
  {
   if( jahr < 99 )         // -> diese Routine funktioniert dann von 1999 - 2098 und muß ab jedem neuen Jahrhundert
    jahr += 2000;       // neu angepasst werden, falls es bis dahin keine besseren preisgünstigen RTC's gibt.
  else
    jahr += 1900;
  }
 
  if(jahr%4 == 0 && (jahr%100 != 0 || jahr %400 == 0))
   ret_value=TRUE;
  else
   ret_value=FALSE; 

  return(ret_value);
}


2) Berechnung des Wochentages:

(mit folgenden Rückgabewerten: 0 = Monat, 1 = Dienstag,... 6 = Sonnatg.)

Listing 2:


BYTE GetWeekday(int jahr, BYTE monat, BYTE tag)
{
// monat: von 1... 12, tag von 1... 31.
BYTE wochentag;

if( jahr < 100 )         // Problem mit 2-stelliger Jahresangabe: s.o.
{
   if( jahr < 99 )        
    jahr += 2000;      
  else
    jahr += 1900;
}

if(monat <= 2)
{
  moant += 10;
--jahr;
}
else
  monat -= 2;

wochentag = (tag+(13*monat-1)/5+jahr+jahr/4-jahr/100+jahr/400)%7;
 
// Korrektur auf die für viele RTC's gebräuchliche Notation mit 0 = Mo, 1 = Di,... 6 = So

if(wochentag == 0)
  return(6);
else
  return(wochentag-1);
}


Der Vollständigkeit halber noch:

3) Bestimmung des letzten Tages des Monats:

(nicht vergessen, das natürlich das Jahr und der Monat vor dem Tag eingestellt werden muß)

Listing 3:


BYTE GetLastDay(int jahr, BYTE monat)
{
case 1:   return(31);
case 2:   return(28+IsSchaltjahr(jahr));
case 3:   return(31);
case 4:   return(30);
case 5:   return(31);
case 6:   return(30);
case 7:   return(31);
case 8:   return(31);
case 9:   return(30);
case 10: return(31);
case 11: return(30);
case 12: return(31);
default: return(31);
}

 


Home ] Nach oben ] [ Teme: Datum ] Interpol_download ]