Datums-Arithmetik

 

Der Umgang mit Datumsangaben ist ein Sonderfall des  Rechnens.  Die FLEX-Sprache hält hierfür einige sehr mächtige Befele bereit, mit denen ohne tiefere Kenntnis die Datumsarithmetik leicht beherrschbar ist.

 

date b

    Datum (und Uhrzeit) werden in die interne Variable kopiert. Default für b ist 17.

b = Breite des Datums, 8-17 Byte; 8 ist nur das Datum, 17 ist Datum/vollständige Uhrzeit

Das Ergebnis am 7.5.2007 um 20:25 wäre (mit b=17):

2 0 0 7 0 5 0 7 / 2 0 : 2 5 : 0 0

 

Dieses speichert man mit    insert ...   in eine Kategorie, ein Teilfeld oder eine #uxy

 

Die so erzeugte Art des Datums hat den großen Vorteil, maschinell sortierbar zu sein.  Der Befehl ist aber eigentlich Luxus, denn genau dasselbe erhält man mit der Sonderkategorie #dts:

var #dts(0,b)   avanti

 

Tip: Das Tagesdatum in der (nicht maschinell sortierbaren) Form, z.B.   Mon, 5. Dec 2011  kann man sich so besorgen:

 

var #dt   avanti

 

dann steht es in der iV.

 

 

Sonderbefehle für Datumsrechnungen:

 

day +x / -x    avanti

Nummer des heutigen Tages  +x   bzw. -x  Tage innerhalb des betreffenden Jahres. Wenn z.B. heute der 31.12. ist, ergibt  day +1  den Wert 1.

 

Day +x / -x   avanti

Datum des heutigen Tages +x  bzw. -x Tage, und zwar in der Form

   JJJJMMTT/hh:mm:ss = Tag, TT. Monat Jahr

z.B. 20010423/10:18:56 = Mo, 23. Apr 2001

 

Ist ein negativer Wert angegeben, also -x , dann wird zurückgerechnet.

Der Wert x  darf bis zu 12000 betragen (Zeitspanne 1970 bis 2099).

Ist hinter  Day  nichts angegeben, wird der Inhalt der iV genommen (d.h. diese muß mit + bzw. - beginnen).

 

Day datum

Vom Datum datum, in der Form JJJJMMTT angegeben, wird umgerechnet auf die Form

   JJJJMMTT/00:00:00 = WT, TT. MN. JJJJ

die dann in der iV steht. Dabei ist WT der Wochentag (Mo, Di, ...) und MN der Monatsname (Jan, Feb, ...)

Das Wichtigste: hiermit kann man zu einem gegebenen Datum den Wochentag feststellen.

Dies funktioniert für die Jahre 1901 bis 2099. Beispiel:

                Day 20051224  ergibt  20051224/00:00:00 = Sa, 24. Dez. 2005

 

Day datum+x

Day datum-x

Vom Datum datum, in der Form JJJJMMTT angegeben, wird x Tage weiter- bzw. zurückgerechnet.

Das sich ergebende Datum steht dann in der iV, und zwar ebenfalls in der Form

   JJJJMMTT/00:00:00 = TN, TT. MN. Jahr

 

Day datum1-datum2

Differenz in Tagen zwischen datum1 und datum2 , beide in der Form JJJJMMTT

Die Zahl steht dann in der iV. Beide Daten müssen zwischen 1971 und 2037 liegen.

 

Beispiele: Zur Demonstration der Datumsbefehle kann man sich die Datei   holidays.flx  anschauen, mit der die Berechnung der  kirchlichen Feiertage  durchgeführt wird. Gebraucht wird dabei die Berechnung des Osterdatums, die man sich als Unterprogramm auch aus dem FLEX   gauss.flx   kopieren kann.

Einfachere Beispiele sind die FLEXe  weekday.flx  und  ostertag.flx , mit denen man die Wochentage eines gewünschten Datums von 1901 bis 2099 feststellen kann bzw. das Datum des Osterfestes von 1700 bis 2199.

Ferner:  leapyear.flx  zur Feststellung, ob ein gegebenes Jahr ein Schaltjahrist.

Die umfangreichste Anwendung der Datumsbefehle ist die  Kalenderfunktion , die mit V25.5 herausgebracht wurde. Sie liefert Kalenderblätter für die Jahre 1601 bis 2399. Das wurde möglich durch eine Weiterentwicklung:

 

Alternative  (auch für avanti )

Ab V29.2 gibt es ein FLEX-Unterprogramm :Day (verpackt in day.inc), das einen größeren Aktionsradius hat, und zwar 1601 bis 2399.

Statt wie bisher

var ...

Day 

 

schreibt man damit gleichwertig (und das versteht auch acon):

 

var ...

perform Day

...

end

include day.inc    // da steckt das UP  :Day  drin

 

 

Sonderbefehl:

 

Wday +x / -   avanti

Datum des heutigen Tages +x bzw. -x Arbeitstage , und Form wie bei Day +x

Voraussetzung: Es sind Kalendersätze für das laufende und nachfolgende Jahr geladen. Das geschieht mit dem Befehl  kalend . Kalendersätze anlegen kann man mit dem FLEX   a-kalend.flx .

Gebraucht wird dies zur Errechnung des Rückgabedatums bei Ausleihen (aLF).

 

 

Beispiel 1:    Ausprobieren 

Ziel: aktuelles Datum aus JJJJMMTT  in  TT-MM-JJJJ umwandeln

 

 aktuelles Datum in die iV holen (das sind immer 8 Ziffern)

date 8

 in Nutzervariable #uad ablegen

ins #uad

 einzelne Teile zusammenbauen zu der Form  Tag-Monat-Jahr

var #uad(6,2) "-" #uad(4,2) "-" #uad(0,4)

 

Beispiel 2:

Ziel: aktuelles Datum in der Form  17. Mar 2005  in der iV bereitstellen

 

 Variable #dt benutzen (Handb.10.2.6.2), Wochentag abschneiden

var #dt(b",")

   denn hinter dem Komma beginnt das Datum: #dt hat die Form   Thu, 17. Mar 2005

 

Beispiel 3:

Ziel: aktuelles Datum in deutscher Form:  "Do, 17. Mrz 2005"  in der iV bereitstellen

var #dts

Day

var (b"= ")