Source wurde am 15.07.2007 aus der MMJ-Quellcodesammlung (Dietmar Horn) in die Babyklappe auf XProfan.Com abgelegt:
Datumsrechnungen
goto weiter diese Anweisung erlaubt die Ausführung dieses Testprogramms
Testprogramm und Beschreibung der Prozedur InfDatum
in der Includedatei InfDatum.Inc
Version 2.5 07.03.2005. Die Prozedur kann frei benutzt werden, für
Schäden kann keine Haftung übernommen werden.
Autor: Gerhard Putschalka
email: g.putschalka@web.de
homepage: http://members.telering.at/g.putschalka/index.html
Die Prozedur Get_erweitertes_Datum erwartet die Eingabe eines Datums in der Form als
Tag + Monat + Jahr oder Tag im Jahr + Jahr (dabei als Monat 0 eingeben!).
Ein Datum ist erst ab 1. Jänner 1601 gültig.
Die Prozedur prüft das Datum auf Gültigkeit und gibt folgende Informationen zurück:
- Tag im Monat
- Monat
- Jahr
- Wochentag (als Nummer. 0 = Sonntag, ... 6 = Samstag)
- Tag im Jahr
- Anzahl Tage im Jahr (365 oder 366 bei einem Schaltjahr)
- Datum des ersten Tages der Kalenderwoche 1 (TTMMJJJJ)
- Datum Palmsonntag (TTMMJJJJ) (ist Basis zu den beweglichen kirchl. Feiertagen)
Der Returncode (@&(0)) der Prozedur sagt aus ob das Datum ungültig ( = 0) oder
gültig ( = 1) ist.
Der Palmsonntag bestimmt alle weiteren beweglichen katholischen Feiertage:
Palmsonntag = das ermittelte Datum
Ostersonntag = Palmsonntag + 7 Tage
Ostermontag = Palmsonntag + 8 Tag
Christi Himmelfahrt = Palmsonntag + 46 Tage
Pfingstsonntag = Palmsonntag + 56 Tage
Pfingstmontag = Palmsonntag + 57 Tage
Fronleichnam = Palmsonntag + 67 Tage
(kann einfach bestimmt werden: Aufruf der Prozedur mit irgendeinem Datum im Jahr, danach
wieder aufrufen mit dem Datum des Palmsonntags, addieren des obigen Wertes zum Julianischen
Tag des Palmsonntags und wiederaufrufen mit Übergabe des neuen Julianischen Tages und mit
Monat 0).
---------
Mit der PROZEDUR werden zwei Bereichsvariablen Q_Datum# und Q_FileTime# global deklariert.
Diese sind im PROGRAMM mit DIM Q_Datum#,34 undDim Q_FileTime#,10 zu dimensionieren und
vor dem Programmende mit Dispose Q_Datum# und Dispose Q_FileTime# wieder freizugeben.
Vor dem Aufruf von InfDatum muß die Bereichsvariable gefüllt werden (die hier
angeführten Variablen sind namentlich frei wählbar - ausgenommen Q_Datum#):
Bei Eingabe von Tag, Monat Jahr:
WORD Q_Datum#,0 = Jahr&
WORD Q_Datum#,2 = Monat&
WORD Q_Datum#,6 = Tag&
WORD Q_Datum#,18 = Anzahl Tage zu addieren oder zu subtrahieren, oder 0 *)
- oder bei Eingabe von Jahr und Tag im Jahr (Julianisches Datum)
WORD Q_Datum#,0 = Jahr&
WORD Q_Datum#,2 = 0
WORD Q_Datum#,6 = Tag& Tag im Jahr (Julianisches Datum)
WORD Q_Datum#,18 = AnzTage& normal 0, Wert wenn Anzahl Tage zum eingegebenen Datum zu
addieren oder subtrahieren (Wert negativ angeben) sind
*) für Q_Datum#,18 (Anzahl Tage) ist der Wert immer positiv einzugeben. Sollen die Tage
subtrahiert werden ist bei @Byte(Q_Datum#,20) ein Minuszeichen (Bindestrich) einzu-
geben (Char Q_Datum#,20 = - für Addieren: Char Q_Datum#,20 =
Die Prozedur füllt die Bereichsvariable (wenn Returncode = 1): Und die Werte sind:
Jahr& = @Word(Q_Datum#,0) Jahr
Monat& = @Word(Q_Datum#,2) Monat
DWeek& = @Word(Q_Datum#,4) Tag der Woche (0 = Sonntag, 1 = Montag, u.s.w.)
Tag& = @Word(Q_Datum#,6) Tag im Monat
KaWoch& = @Word(Q_Datum#,8) Kalenderwoche des eingegeben Tages
Tagnum& = @Word(Q_Datum#,16) Tag im Jahr
ATage& = @Word(Q_Datum#,18) Anzahl Tage zu addieren oder subtrahieren
Minus$ = @Byte(Q_Datum#,20) Vorzeichen für Tage zu subtrahieren (leer oder - )
ErstTg& = @Word(Q_Datum#,21) 1. Tag der 1. Kalenderwoche
ErstMt& = @Word(Q_Datum#,23) Monat der 1. Kalenderwoche
ErstJr& = @Word(Q_Datum#,25) Jahr der 1. Kalenderwoche
PalmTg& = @Word(Q_Datum#,27) Tag Palmsonntag
PalmMt = @Word(Q_Datum#,29) Monat Palmsonntag
AnzTge& = @Word(Q_Datum#,31) Anzahl Tage im Jahr (normal = 365, Schaltjahr = 366)
ACHTUNG: es werden 2 Bereichsvariablen Q_Datum# und Q_FileTime# verwendet. Diese
sind in der Includedatei InfDatum.inc declariert, müssen aber im Programm
dimensioniert werden! (DIM Q_Datum,32 und DIM Q_FileTime,10)
======================================================================
weiter:
====
Testprogramm
====
$I InfDatum.inc
Declare Tag&,Monat&,Jahr&,WTag&,DWeek&,Retrn&,WoTag$,Datum$,TagNum&,Tage&,AddTage&,Anzahl$
Let WoTag$ = Sonntag;Montag;Dienstag;Mittwoch;Donnerstag;Freitag;Samstag
-----------
Datumseingabe verlangen (TTMMJJJJ oder TTT00JJJJ) immer führende Nullen !
Let Datum$ = @Input$(Datum eingeben (TTMMJJJJ oder TT00JJJJ) ,,)
If (Len(Datum$) < 8) or (Len(Datum$) > 9)
@MessageBox(kein Datum oder das Datum wurde in ungültiger Länge eingegeben,Datum$,32)
Else
If (@Len(Datum$) = 8) im Format Tag, Monat und Jahr
Let Tag& = @Val(@Mid$(Datum$,1,2))
Let Monat& = @Val(@Mid$(Datum$,3,2))
Let Jahr& = @Val(@Mid$(Datum$,5,4))
Else oder im Format Tag und Jahr
Let Tag& = @Val(@Mid$(Datum$,1,3))
Let Monat& = @Val(@Mid$(Datum$,4,2))
Let Jahr& = @Val(@Mid$(Datum$,6,4))
EndIf
--------------------
Dim Q_Datum#,40
Dim Q_FileTime#,10
Clear Q_Datum#
Zuordnen Tag, Monat und Jahr - oder Tag (im Jahr) mit Monat 0 und Jahr
WORD Q_Datum#,0 = Jahr&
WORD Q_Datum#,2 = Monat&
WORD Q_Datum#,6 = Tag&
WORD Q_Datum#,18 = 0
Let Anzahl$ = @Trim$(@Input$(z.B. 0, oder 5 oder -5),Anzahl Tage hinzufügen,))
Case (Anzahl$ = ) : Anzahl$ = 0
Print Eingegeben wurde: +Datum$+, Anzahl Tage +Anzahl$
Print
Minuszeichen aus Anzahl$ entfernen und nach Q_Datum#,20 übertragen
If (@Instr(-,Anzahl$))
Char Q_Datum#,20 = -
Anzahl$= @Translate$(Anzahl$,-,)
EndIf
Word Q_Datum#,18 = @Val(Anzahl$)
InfDatum Aufruf der Prozedur, konvertiere Datum
Let Retrn& = @&(0)
If Retrn&
auswerten der Daten
Let Jahr& = @Word(Q_Datum#,0) Jahr
Let Monat& = @Word(Q_Datum#,2) Monat
Let DWeek& = @Word(Q_Datum#,4) Tag der Woche (0 = Sonntag, 1 = Montag u.s.w.)
Let Tag& = @Word(Q_Datum#,6) Tag im Monat
Let Tagnum& = @Word(Q_Datum#,16) Tag im Jahr
Let Tage& = @Word(Q_Datum#,31) Anzahl Tage im Jahr (normal = 365, Schaltjahr = 366)
Let WoTag$ = @Substr$(WoTag$,(DWeek& + 1),;) übersetze Wochentag
Print Ergebnis:
Print
Print WoTag$,Tag&;.;Monat&;.;Jahr&;, der,TagNum&;. Tag im Jahr. Das Jahr hat,Tage&,Tage
Print
Print der Tag liegt in der Kalenderwoche ,@Word(Q_Datum#,8);/;@Word(Q_Datum#,0)
Print
Let Tag& = @Word(Q_Datum#,21) 1. Tag in 1. Kalenderwoche
Let Monat& = @Word(Q_Datum#,23) Monat
Let Jahr& = @Word(Q_Datum#,25) Jahr
Print die Kalenderwoche 1 beginnt mit dem,Tag&;.;Monat&;.;Jahr&
Print
Let Tag& = @Word(Q_Datum#,27) Tag Palmsonntag
Let Monat& = @Word(Q_Datum#,29) Monat Palmsonntag
Let Jahr& = @Word(Q_Datum#,0) Jahr Palmsonntag
Print der Palmsonntag ist am,Tag&;.;Monat&;.;Jahr&
Print
als Beispiel den Ostersonntag errechnen:
setze Datum des Palmsonntags als Tag und Monat (Das Jahr kann nur das selbe sein)
setze 7 als zu addierende Tage, lösche ein eventuelles Minuszeichen.
WORD Q_Datum#,2 = @Word(Q_Datum#,29) Monat Palmsonntag
WORD Q_Datum#,6 = @Word(Q_Datum#,27) Tag Palmsonntag
Word Q_Datum#,18 = 7
Char Q_Datum#,20 =
InfDatum Aufruf der Prozedur, konvertiere Datum
Let Jahr& = @Word(Q_Datum#,0) Jahr
Let Monat& = @Word(Q_Datum#,2) Monat
Let Tag& = @Word(Q_Datum#,6) Tag im Monat
Print der Ostersonntag ist am,Tag&;.;Monat&;.;Jahr&
Print
Else
Print Datum ist ungültig
EndIf
Print
Print beenden mit linker Maustaste oder mit der Entertaste
waitinput
Dispose Q_FileTime#
Dispose Q_Datum#
EndIf
Fin