Zitat von
marabu:
der Datentyp TDateTime arbeitet auf eine halbe Millisekunde genau
Zitat von
himitsu:
Im Jahr 1601 (oder so) kommt man auch locker auf 0,1 Millisekunden. und in ein paar hundert Jahren kann man froh sein, wenn man da noch eine Sekunde rausbekommt.
@marabu:
Nein, Du kannst 1/10 Millisekunde problemlos auflösen, jedenfalls im Bereich 01.01.0001 bis 31.12.9999, wobei beide Grenzwerte in der Praxis wohl keine Rolle spielen. Ersterer nicht, weil er vor unserer Datumsrechnung liegt.
@himitsu:
Wie im Kommentar für marabu gesagt, kann man mit TDateTime 1/10000 Sekunden auch im Jahr 9999 korrekt darstellen.
Wie komme ich zu dieser Aussage?:
Ein TDateTime-Wert ist ein Double-Wert, dessen Integer-Teil den laufenden Tag, gezählt ab 30.12.1899 (30.12.1899 = 0) abbildet. Der Nachkommateil gibt die Zeit am betreffenden Tag wieder.
Der 31.12.9999 hätte einen Integer-Teil = 2958465.
Um diesen Wert darzustellen werden 22 Bits der 52-Bit-Mantisse benötigt.
Somit bleiben für den Nachkomma-Teil 30 Bits verfügbar, mit denen 1073741824 unterschiedliche Werte verwaltet werden können. Geteilt durch 86400 (Sekunden/Tag) ergibt das 12427 verschiedene Werte pro Sekunde.
Das ist die Theorie.
Und wie sieht das in der Praxis aus ?:
Für eine Auflösung von 1/10000 s werden für einen Tag 86400*10000 = 864000000 "Einheiten" benötigt.
Wenn man nun den Integerwert eines Doubles auf 2958465 (=31.12.9999) setzt und dann für jede dieser 864000000 "Einheiten" (erfolgreich) prüft, ob es möglich ist, einen TDateTime-Wert zu generieren und anschließend wieder korrekt in Jahr,Monat,Tag, und "Einheit" umzuwandeln, dann kann man TDateTime für eine Auflösung von 1/10000 s verwenden.
Das habe ich geprüft - es funktioniert.
Wenn man allerdings mit solchen Werten rechnen will, kommt es zu Ungenauigkeiten.
Aber das passiert auch bei sehr viel geringeren Auflösungen.
Versuche mal folgendes (zugegebenermaßen etwas extremes Beispiel):
Delphi-Quellcode:
PROCEDURE TMain.Test;
var dt,dt3:TDateTime; i:integer;
begin
dt:=Date;
dt3:=1/3;
for i:=1 to 3000000 do dt:=dt+dt3;
ShowMessage(DateTimeToStr(dt));
end;
Du wirst sehen, daß da eine Abweichung von 4 s auftritt.
Fazit : Wer mit Zeiten wirklich exakt rechnen will, der sollte sich nicht auf TDateTime verlassen.