Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi MinutesBetween - Wie Ungenauigkeit verhindern? (https://www.delphipraxis.net/80807-minutesbetween-wie-ungenauigkeit-verhindern.html)

Daniel G 15. Nov 2006 16:35


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?

hoika 15. Nov 2006 16:41

Re: MinutesBetween - Wie Ungenauigkeit verhindern?
 
Hallo,

zeig mal den Code.
Du machst da was verkehrt.
Wahrscheinlich dort noch Millisekunden irgendwo drin.


Heiko

3_of_8 15. Nov 2006 16:44

Re: MinutesBetween - Wie Ungenauigkeit verhindern?
 
Nein, tut er nicht.

Delphi-Quellcode:
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))));
Ergebnis:
1. Messagebox: 120
2. Messagebox: 119

Ich denke mal, das ist das typische Problem der Ungenauigkeit mit Floats.

verwirrt 15. Nov 2006 16:47

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ß

Daniel G 15. Nov 2006 16:47

Re: MinutesBetween - Wie Ungenauigkeit verhindern?
 
Zitat:

Zitat von hoika
Du machst da was verkehrt.

Wie 0815 schon gesagt hat, das tu' ich nicht. :wink: Zumindest wüsste ich das nicht. :shock:

Delphi-Quellcode:
MinutesEdit.Text := IntToStr(MinutesBetween(StrToTime(TimeFromMskEdt.Text),StrToTime(TimeToMskEdt.Text)));
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:

//Edit:
@verwirrt: Ähä... :gruebel:

verwirrt 15. Nov 2006 16:57

Re: MinutesBetween - Wie Ungenauigkeit verhindern?
 
mh,

müsste lauten:

Delphi-Quellcode:
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))));
3_of_8 hat in der zweiten Zeile

... 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ß

3_of_8 15. Nov 2006 17:07

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.

alzaimar 16. Nov 2006 07:39

Re: MinutesBetween - Wie Ungenauigkeit verhindern?
 
Wieso nicht einfach

Delphi-Quellcode:
  MyMinutesBetween := Trunc (0.5 + (aDate - anotherDate)*1440);

negaH 16. Nov 2006 21:35

Re: MinutesBetween - Wie Ungenauigkeit verhindern?
 
Delphi-Quellcode:
MyMinutesBetween := Trunc (0.5 + (aDate - anotherDate)*1440);
Hm ich würde es so machen

Delphi-Quellcode:

MyMinutesBetween as Int64 := Round(aDate * 1440) - Round(anotherDate * 1440);
Das dürfte die entstehende "Ungenauigkeit" der Subtrakton beider TDateTime=Double eliminieren und zusätzlich noch durch Round() auf beiden Seiten Rundungsfehlern entgegenwirken.

Gruß Hagen

Daniel G 16. Nov 2006 21:38

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