Da mich das interessiert hab ich nochmal die Doku nachgesehn
DateAndTime format beinhaltet die absoluten Werte für: Jahr, Monat, Tag
das ist kein fortlaufender Wert! Wenn man da Tage addieren will,
dann müssen die Überläufe für die Monate mit 30/31 Tagen und Februar 28 Tage
sowie die korrekten Schaljahre mit berücksichtigt werden.
Das geht vernünftig nur, wenn man Jahr, Monat, Tag zuerst wieder in ein DATE verwandelt,
dann die Tage addiert und DATE wieder zurück zu Jahr, Monat, Tag.
d.h. DateAndTime splitten du DATE und TimeOfDay, dann Tage addieren und wieder zusammenfassen.
ich hab zwar eine Formel wie man Jahr, Monat, Tag zu einem DATE verbindet.
Rückwärts: DATE => Jahr, Monat, Tag ist aber schwer was zu finden.
Hab mit mal den FC3 D_TOD_DT intern angesehn! TOD + DATE zu DateAndTime
Das ist ne ganz schöne rechnerei! Da werden die Schaltjahrzyklen rausgerechnet, die Tage
korrigiert, der korrekte Monat zu den Tagen gesucht ...!
Hab mal versucht eine korrekte Berechnungsvorschirft für den gregorianschen Kalender zu finden,
aber irgendwie Fehlanzeige. Irgendwo muss das doch dokumentiert sein wie das geht!
Klar ist noch folgendes!
Schaltjahre alle 4 Jahre, alle 100Jahre fällt es aus und alle 400 Jahre fällt es nicht aus.
1 voller Schaltjahrzyklus 4 Jahre = 4+365Tage + 1 Schalttag = 1461 Tage
Code:
dDATE: DINT; // DINT mit Nr. des Tages (DATE)
YY : DINT; // Jahreszahl
MM : DINT; // Monat
DD : DINT; // TAG
Die Anzahl der Schaltjahreszyklen errechnet sich:
SchaltJahrZyklen:= dDate/1461;
RestTage := dDAte MOD 1461; // Resttage die keinen vollen Schaltjahrzykls mehr ergeben (max 3 Jahre +365 Tage = 1460 Tage max.)
AusgefalleneSchaltjahre: SchaltJahrZyklen/25 - SchaltJahrZyklen/100; // jeden 25 Zyklus fällt ein Schaltjahr aus, jeden 100 Zyklus findet es statt
// jetzt noch Resttage korriegieren, da die ausgefallen Schalttage bisher bereits abgezogen wurden
RestTage := RestTage + AusgefalleneSchaltjahre;
// dann wieviele volle Jahre geben die SchaltjahrZyklen + Resttage noch?
// Da bei den Resttagen kein Schaltjahr mehr dabei sein kann können wir fix 365Tage verwenden
YY:= SchaltjahrZyklen * 4 + Resttage/365; // Anzahl der Jahre (wahrscheinlich muss man für die Jahreszahl zu den Anzahl Jahren noch 1 addieren)
Resttage := Resttage MOD 365; // für Monate verbleibende Tage
// nun muss man noch korrekten Monat aus Resttagen bestimmen
// wie ???
// wenn Rest =0, dann ist man beim 31.12. des Jares,
// sonst ist man im nächsten Jahr => die Jahreszahl muss nochmals korrigiert werden
// mein Ansatz wäre jetzt ne Schleife in der ich von den Resttagen immer die Anzahl der Monate von 1..x abziehe, bis nichts mehr übrig bleibt!