Register
Datums-Arithmetik
Der Umgang mit Datumsangaben ist ein Sonderfall des Rechnens. Die FLEX-Sprache hält hierfür einige sehr mächtige Befehle 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) acon
Tip: Das Tagesdatum in der (nicht maschinell sortierbaren) Form, z.B. Mon, 5. Dec 2011 kann man sich so besorgen:
var #dt acon
dann steht es in der iV.
Sonderbefehle für Datumsrechnungen:
day +x / -x acon
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 acon
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 acon )
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 / -x acon
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"= ")