Fast jede Kalendersoftware, die mit Kalenderfunktionen rechnet, bedient sich daurch,
daß sie Tage ab einem bestimmten Datum aufsteigend durchnumeriert.
Die meisten Kalender bedienen sich am Julianischen Tag und dem Julianischen Datum
nach der Definition von Scaliger. Er definiert den Tag 0 im Julianischen Kalender
mit dem Datum 1.1.4713 12 Uhr mittags v. Chr.
Andere Kalender benötigen diesen großen Zeitraum nicht und begnügen sich mit dem Gregorianischen
Kalenderbereich ab 15.10.1582 aufwärts oder in noch kleineren Zeiträumen wie z.B. der
Windows-Kalender, der sehr bescheidenen Ansprüchen genügt.
Ich hatte hier schon einmal gezeigt, wie man einfacher mit dem Gregorianischen Tag
und dem Gregorianischen Datum rechnen kann (Gregor(1) = 15.10.1582 usw...).
Die Kalenderfunktionen bei Delphi haben dagegen eine eigenwillige Zählweise,
die nachstehender Tabelle zu entnehmen ist. Der "Urknall" beginnt bei dem Datum
01.01.0001 mit julianischer Numerierung und wechselt ab 15.10.1582 zur gregorianischen, indem
korrekterweise einfach 10 Tage übersprungen werden. Der Tag 1 findet am 31.12.1899
statt, warum auch immer (Delphi 2005, andere Versionen habe ich nicht getestet).
Da ich nicht nur in Delphi code, habe ich mir ein paar kleine Routinen geschrieben,
die nur mit postiven Tageszahlen arbeiten (DelphiDay und DelphiDayToDate),
die nur den ganzzahligen Anteil von TDateTime benutzen.
Vielleicht kann das ja jemand von Euch außer mir auch noch gebrauchen.
Datum___________Delphi-Tagesnr.____________Neue Tagesnr.
________________DelphiNumberOrg____________DelphiN umber
01.01.0001______-693593________________________________1
04.10.1582______-115869___________________________577725
15.10.1582______-115858___________________________577736
29.12.1899___________-1___________________________693593
30.12.1899____________0___________________________ 693594
31.12.1899____________1___________________________ 693595
01.01.2000_______365526___________________________ 730120
31.12.9999______2958465__________________________3 652059
Delphi-Quellcode:
//Wolfgang Mix - Delphi-PRAXiS
//Delphi day number
function DelphiDayOrg(d,m,yyyy:word):longint;
var tmp:TDateTime;
Begin
Tmp:=Encodedate(yyyy,m,d);
result:=round(tmp-StrTodate('
30.12.1899'));
end;
//Wolfgang Mix - Delphi-PRAXiS
//Returns positive Delphi day number
function DelphiDay(d,m,yyyy:word):longint;
var tmp:TDateTime;
Begin
Tmp:=Encodedate(yyyy,m,d);
result:=1+round(tmp-StrTodate('
01.01.0001'));
end;
//Wolfgang Mix - Delphi-PRAXiS
//Returns Delphi day number as date
function DelphiDayOrgToDate(n:longint):TDate;
Begin
If (n>=-693593)
and (n<=2958465)
then result:=n
else raise Exception.CreateFmt('
Invalid day number',[result]);
end;
//Wolfgang Mix - Delphi-PRAXiS
//Returns new positive day number as date
function DelphiDayToDate(n:longint):TDate;
Begin
If (n>=1)
and (n<=3652059)
then
result:=n-693594
else raise Exception.CreateFmt('
Invalid day number',[result]);
end;
Gruß
Wolfgang