Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - MinuteSpan unter D5


maxk - So 09.11.03 17:30
Titel: MinuteSpan unter D5
Ich hoffe ich habe jetzt die richtige Sparte erwischt...
Also unter D6 gibt es die unit DateUtils, die viele praktische Funktionen anbietet. Darunter auch MinuteSpan und SecondSpan. Beim Versuch, das Prog unter D5 zu compilen traf ich auf ein Problem. Es gibt werder MinuteSpan noch DateUtils. Ich brauche diese Funktionen aber. Kennt jemand einen Codeschnipsel? MinuteSpan errechnet die Minuten zwischen zwei TDateTimes. Die Funktion würde mit den Parametern '01.01.2000 00:00:00' und '01.01.2000 00:02:30' würde 2,5 zurückgegeben.

Danke schon mal im Voraus,
maxk


Anonymous - So 09.11.03 17:43

MinuteSpan wäre dann:


Delphi-Quelltext
1:
MinsPerDay * (a-b)                    


wenn a nach b ist, ansonsten eben umgekehrt. MinsPerDay ist in SysUtils. Für die anderen Funktionen musst du MinsPerDay durch SecsPerDay etc. ersetzen.


Wolff68 - Mo 10.11.03 20:45

Und wenn Du nicht sicher bist ob a > b ist, mach einfach ein ABS() drumrum.


Delphi-Quelltext
1:
Result := MinsPerDay * ABS(a-b);                    


Hier übrigends mal die entsprechenden "CodeSchnipsel" aus der DateUtils:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function MinuteSpan(const ANow, AThen: TDateTime): Double;
begin
  Result := MinsPerDay * SpanOfNowAndThen(ANow, AThen);
end;

function SpanOfNowAndThen(const ANow, AThen: TDateTime): TDateTime;
begin
  if ANow < AThen then
    Result := AThen - ANow
  else
    Result := ANow - AThen;
end;

Wobei ich die SpanOfNowAndThen irgendwie übertrieben find. Ein Abs() tuts auch...


barfuesser - Di 11.11.03 09:59

Wolff68 hat folgendes geschrieben:
Wobei ich die SpanOfNowAndThen irgendwie übertrieben find. Ein Abs() tuts auch...

Das spart einen Funktionsaufruf! Und da man davon ausgehen sollte, daß der Delphi-Code auch in aufwendigen Schleifen wiederholt ausgeführt werden kann, sollte dieser schon auf zusätzliche Funktionsaufrufe verzichten.

barfuesser


Wolff68 - Di 11.11.03 18:21

Und worin liegt jetzt der genaue Unterschied zwischen
SpanOfNowAndThen(ANow, AThen) und Abs(ANow-AThen) ?

Beides sind Funktionsaufrufe. Wobei bei SpanOf 2 Variablen übergeben werden und bei ABS nur einer (der dafür gleich ausgerechnet wird).


maxk - Do 13.11.03 19:00

Danke, hat funktioniert. Übrigens, warum ist der Abstand von 01:00:00 bis 02:00:00 nicht 60 Minuten, sondern 59,99999967..?

maxk


barfuesser - Do 13.11.03 19:22

maxk hat folgendes geschrieben:
Übrigens, warum ist der Abstand von 01:00:00 bis 02:00:00 nicht 60 Minuten, sondern 59,99999967..?

Vielleicht ein Rundungsfehler? Real-Typen können nur mit einer begrenzten Genauigkeit gespeichert werden und werden deshalb gerundet. Außerdem ist zu beachten, daß RealZahlen, die im Zehnersystem nur eine begrenzte Stellenzahl haben, im Binärsystem durchaus bis zu unendlich viel Stellen haben können. Aus diesem Grund kommt es bei der Benutzung von Realzahlen - wozu auch TDateTime gehört - immer wieder zu geringfügigen Abweichungen.

barfuesser