![]() |
SecondsBetween fehlerhaft?
Hi,
ich habe ein kleines Problem mit der Funktion SecondsBetween aus den DateUtils. Diese gibt in manchen Fällen ein fehlerhaftes Ergebnis aus. Beispiel:
Delphi-Quellcode:
Ergebnis:
program Test;
{$APPTYPE CONSOLE} uses SysUtils, DateUtils; var Date1, Date2: TDateTime; Dummy: Char; begin Date1 := StrToDateTime('20.05.2010 13:57:40'); Date2 := StrToDateTime('20.05.2010 14:02:40'); WriteLN(DateTimeToStr(Date1), ' - ', DateTimeToStr(Date2), ' = ', SecondSpan(Date1, Date2), ' = ', SecondsBetween(Date1, Date2)); Date1 := StrToDateTime('20.05.2010 14:57:40'); Date2 := StrToDateTime('20.05.2010 15:02:40'); WriteLN(DateTimeToStr(Date1), ' - ', DateTimeToStr(Date2), ' = ', SecondSpan(Date1, Date2), ' = ', SecondsBetween(Date1, Date2)); Read(Dummy); end. Zitat:
Das wird wohl daran liegen, dass TDateTime ein Double ist und darum Ungenauigkeiten in den Nachkommabereichen auftreten. Allerdings erwarte ich von einer offiziellen Funktion dass diese auch funktioniert (Wortspiel! :cyclops: ). Ich behelfe mir im Moment so:
Delphi-Quellcode:
ich weiß aber nicht, ob sich diese Funktion immer richtig verhält.
function MySecondsBetween(const ANow, AThen: TDateTime): Int64;
begin Result := Round(SecondSpan(ANow, AThen)); end; Was haltet ihr davon? Dominik |
Re: SecondsBetween fehlerhaft?
Ja, die Funktion Secondsbetween hat einen Bug :(
Das Problem daran ist, dass die SecondBetween so implementiert ist: Result := Trunc(SecondSpan(ANow, AThen)); ...und das Trunc macht hier diesen Bug aus, da es rigoros die Nachkommastellen abschneidet und das stimmt ja so nicht ganz. Round ist hier besser / genauer. Die von dir vorgeschlagene Lösung verwende ich auch, hat eigentlich noch nie versagt... Irgendwo stand sogar im EDN, dass man dies am Besten statt Secondsbetween verwenden soll. |
Re: SecondsBetween fehlerhaft?
![]() |
Re: SecondsBetween fehlerhaft?
Das betrifft alle xxxxBetween Funktionen :)
|
Re: SecondsBetween fehlerhaft?
ok, danke euch :thumb:
|
Re: SecondsBetween fehlerhaft?
Mathematisch sicherer ist wohl, beide Zeiten in Sekunden umzurechnen
und dann die Differenz zu bilden. |
AW: Re: SecondsBetween fehlerhaft?
Zitat:
Beide Seiten abrundend in Sekunden umberechnet, ergibt dann auch wieder soein Rundungsproblem. siehe ![]() Aktuell wird Beides in Millisekunden umgerechnet, subtrahiert und dann abgerundet in Sekunden umgewandelt. |
AW: SecondsBetween fehlerhaft?
Wird es korrekt in Millisekunden umgerechnet? Also z.B. 0.5 ms addiert und dann abgerundet?
|
AW: SecondsBetween fehlerhaft?
Nein, natürlich nicht. :stupid:
Es wird DateTimeToMilliseconds benutzt, welches intern DateTimeToTimeStamp verwendet und das rundet (glaub ich) brav ab. Wie gesagt, es wird (scheinbar) überall nur mit abgeschlossenen Zeiteinheiten gerechnet, also immer ordentlich abrunden, inkl. eventueller Rundungsfehler. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 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