' Datum-Routinen (c) 1996 by Andreas Meile, 8242 Hofen SH ' Demoprogramm DECLARE SUB ErmittleKalenderDatum (aTa&, t%, m%, j%) DECLARE FUNCTION AnzahlTageSeit& (t%, m%, j%) WIDTH 80, 50 DIM Wt$(6) FOR i% = 0 TO 6 READ Wt$(i%) NEXT i% DATA "Samstag", "Sonntag", "Montag", "Dienstag" DATA "Mittwoch", "Donnerstag","Freitag" d$ = DATE$ Ta% = VAL(MID$(d$, 4, 2)) Mo% = VAL(LEFT$(d$, 2)) Ja% = VAL(RIGHT$(d$, 4)) Heute& = AnzahlTageSeit&(Ta%, Mo%, Ja%) PRINT "Heute ist ein "; Wt$(CINT(Heute& MOD 7&)); "." INPUT "Startdatum (tt,mm,jjjj)"; t1%, m1%, j1% INPUT "Sp„teres Enddatum (tt,mm,jjjj)"; t2%, m2%, j2% PRINT "Kalender? (j/n)"; IF INPUT$(1) = "j" THEN FOR Tag& = AnzahlTageSeit&(t1%, m1%, j1%) TO AnzahlTageSeit&(t2%, m2%, j2%) GOSUB GibTagAus NEXT Tag& END IF PRINT Tag1& = AnzahlTageSeit&(t1%, m1%, j1%) Tag2& = AnzahlTageSeit&(t2%, m2%, j2%) Tag& = Tag1&: GOSUB GibTagAus Tag& = Tag2&: GOSUB GibTagAus PRINT "Dazwischen liegen"; ABS(Tag2& - Tag1&); "Tage"; END GibTagAus: ErmittleKalenderDatum Tag&, tg%, mt%, jh% PRINT USING "Der ##_.##_.#### "; tg%; mt%; jh%; d& = Tag& - Heute& IF d& < 0& THEN PRINT "war ein"; -d&; "Tage zurckliegender "; ELSEIF d& = 0& THEN PRINT "ist der heutige "; ELSE PRINT "ist in"; d&; "Tagen ein zuknftiger "; END IF PRINT Wt$(CINT(Tag& MOD 7&)); "." RETURN FUNCTION AnzahlTageSeit& (t%, m%, j%) ' Bestimmt die Anzahl Tage seit dem Referenzdatum 30. Oktober 1 (Samstag) ' vor Christus => Alles unter der Annahme, dass die Regel jedes 100. Jahr ' kein Schaltjahr, aber dafr jedes 400. Jahr wieder ein Schaltjahr schon ' immer richtig gewesen war. Achtung: Aufgrund der Definition der Ganzahl- ' Division in BASIC stimmt die Berechnung erst ab dem 1. M„rz 0 (Christi) IF m% > 2 THEN m1% = m% + 1 j1% = j% ELSE m1% = m% + 13 j1% = j% - 1 END IF a& = CLNG(t% + 153 * m1% \ 5 + j1% \ 4 - j1% \ 100 + j1% \ 400) AnzahlTageSeit& = a& + 365 * CLNG(j1%) END FUNCTION SUB ErmittleKalenderDatum (aTa&, t%, m%, j%) ' Diese Prozedur macht das Inverse zur AnzahlTageSeit&-Funktion: ' Ermittlung des Kalenderdatums, bei 0 = 30. Oktober 1 vor Christus r& = aTa& - 123& j% = 400 * CINT(r& \ 146097) r& = r& MOD 146097 IF r& = 146096 THEN j% = j% + 300 r& = 36524 ELSE j% = j% + 100 * CINT(r& \ 36524) r& = r& MOD 36524 END IF j1% = CINT((r& * 4& + 3&) \ 1461&) j% = j% + j1% r% = CINT(r& - CLNG(j1%) * 365&) - j1% \ 4 + 31 m% = r% * 5 \ 153 t% = r% - (153 * m% - 1) \ 5 IF m% > 10 THEN j% = j% + 1 m% = m% - 10 ELSE m% = m% + 2 END IF END SUB