AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SecondsBetween fehlerhaft?

Ein Thema von dominikkv · begonnen am 20. Mai 2010 · letzter Beitrag vom 21. Aug 2014
Antwort Antwort
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#1

SecondsBetween fehlerhaft?

  Alt 20. Mai 2010, 13:03
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:
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.
Ergebnis:
Zitat:
20.05.2010 13:57:40 - 20.05.2010 14:02:40 = 2.99999999720603E+0002 = 299
20.05.2010 14:57:40 - 20.05.2010 15:02:40 = 3.00000000349246E+0002 = 300
Beides mal ist der Unterschied genau 5 Minuten (= 300 Sekunden), der erste Aufruf zeigt aber eine Differenz von 299 Sekunden!

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! ).

Ich behelfe mir im Moment so:
Delphi-Quellcode:
function MySecondsBetween(const ANow, AThen: TDateTime): Int64;
begin
  Result := Round(SecondSpan(ANow, AThen));
end;
ich weiß aber nicht, ob sich diese Funktion immer richtig verhält.

Was haltet ihr davon?

Dominik
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#2

Re: SecondsBetween fehlerhaft?

  Alt 20. Mai 2010, 13:09
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.
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#3

Re: SecondsBetween fehlerhaft?

  Alt 20. Mai 2010, 13:11
Hier wurde gezeigt, dass auch die Funktion YearsBetween falsch rechnet.
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#4

Re: SecondsBetween fehlerhaft?

  Alt 20. Mai 2010, 13:12
Das betrifft alle xxxxBetween Funktionen
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#5

Re: SecondsBetween fehlerhaft?

  Alt 20. Mai 2010, 13:21
ok, danke euch
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#6

Re: SecondsBetween fehlerhaft?

  Alt 20. Mai 2010, 14:43
Mathematisch sicherer ist wohl, beide Zeiten in Sekunden umzurechnen
und dann die Differenz zu bilden.
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#7

AW: Re: SecondsBetween fehlerhaft?

  Alt 21. Aug 2014, 12:59
Mathematisch sicherer ist wohl, beide Zeiten in Sekunden umzurechnen
und dann die Differenz zu bilden.
Aber nur, wenn man beim Umrechnen nicht auch wieder mit Trunc arbeitet.

Beide Seiten abrundend in Sekunden umberechnet, ergibt dann auch wieder soein Rundungsproblem.
siehe http://www.delphipraxis.net/181510-w...aendert-2.html
Aktuell wird Beides in Millisekunden umgerechnet, subtrahiert und dann abgerundet in Sekunden umgewandelt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

AW: SecondsBetween fehlerhaft?

  Alt 21. Aug 2014, 13:02
Wird es korrekt in Millisekunden umgerechnet? Also z.B. 0.5 ms addiert und dann abgerundet?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#9

AW: SecondsBetween fehlerhaft?

  Alt 21. Aug 2014, 14:49
Nein, natürlich nicht.

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz