| |
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 ] | |
|