![]() |
MinutesBetween - Wie Ungenauigkeit verhindern?
N'Abend :hi:
Wenn ich mithilfe der Funktion MinutesBetween die Differenz zweier Zeiten ermittel will, stoße ich auf folgendes Problem: 12:10:10 => 14:10:10 = 120 Min. Differenz 12:20:20 => 14:20:20 = 119 Min. Differenz Gibt es eine elegante Lösung für dieses Problem? |
Re: MinutesBetween - Wie Ungenauigkeit verhindern?
Hallo,
zeig mal den Code. Du machst da was verkehrt. Wahrscheinlich dort noch Millisekunden irgendwo drin. Heiko |
Re: MinutesBetween - Wie Ungenauigkeit verhindern?
Nein, tut er nicht.
Delphi-Quellcode:
Ergebnis:
showmessage(inttostr(MinutesBetween(EncodeTime(12,10,10,0),EncodeTime(14,10,20,0))));
showmessage(inttostr(MinutesBetween(EncodeTime(12,20,10,0),EncodeTime(14,20,20,0)))); 1. Messagebox: 120 2. Messagebox: 119 Ich denke mal, das ist das typische Problem der Ungenauigkeit mit Floats. |
Re: MinutesBetween - Wie Ungenauigkeit verhindern?
Hallo,
unter Delphi 6 mit Update 2 bekomme ich da jeweils 120, werd noch ein paar andere Werte testen. Gruß |
Re: MinutesBetween - Wie Ungenauigkeit verhindern?
Zitat:
Delphi-Quellcode:
Ich denke mal, das hängt damit zusammen, dass TDateTime intern ein Double - Wert ist. Ich wollte halt nur wissen, ob's zum Kompensieren dieses Problems schon eine Funktion gibt oder nicht. :wink:
MinutesEdit.Text := IntToStr(MinutesBetween(StrToTime(TimeFromMskEdt.Text),StrToTime(TimeToMskEdt.Text)));
//Edit: @verwirrt: Ähä... :gruebel: |
Re: MinutesBetween - Wie Ungenauigkeit verhindern?
mh,
müsste lauten:
Delphi-Quellcode:
3_of_8 hat in der zweiten Zeile
showmessage(inttostr(MinutesBetween(EncodeTime(12,10,10,0),EncodeTime(14,10,10,0))));
showmessage(inttostr(MinutesBetween(EncodeTime(12,20,10,0),EncodeTime(14,20,10,0)))); ... EncodeTime(12,20,10,0),EncodeTime(14,20,20,0)))); ... was natürlich mit 10 Sekunden über den 120 Minuten klare 120 ergab. Fazit: ich kann das mit den 119 jetzt nachvollziehen. Edit: Möglicher Workaround: nimm MilliSecondsBetween oder SecondsBetween und runde... Gruß |
Re: MinutesBetween - Wie Ungenauigkeit verhindern?
Hoppala, hab ich mich vertippt. Getestet hab ichs aber richtig, nur hier wohl falsch abgeschrieben.
TDateTime ist übrigens deklariert als ein type Double, hat also die gleichen Eigenschaften wie ein Double. |
Re: MinutesBetween - Wie Ungenauigkeit verhindern?
Wieso nicht einfach
Delphi-Quellcode:
MyMinutesBetween := Trunc (0.5 + (aDate - anotherDate)*1440);
|
Re: MinutesBetween - Wie Ungenauigkeit verhindern?
Delphi-Quellcode:
Hm ich würde es so machen
MyMinutesBetween := Trunc (0.5 + (aDate - anotherDate)*1440);
Delphi-Quellcode:
Das dürfte die entstehende "Ungenauigkeit" der Subtrakton beider TDateTime=Double eliminieren und zusätzlich noch durch Round() auf beiden Seiten Rundungsfehlern entgegenwirken.MyMinutesBetween as Int64 := Round(aDate * 1440) - Round(anotherDate * 1440); Gruß Hagen |
Re: MinutesBetween - Wie Ungenauigkeit verhindern?
Danke für die Tipps. Was wäre ich bloß ohne euch. :mrgreen:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz