Autor Beitrag
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: So 09.11.03 17:30 
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

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: So 09.11.03 17:43 
MinuteSpan wäre dann:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: Mo 10.11.03 20:45 
Und wenn Du nicht sicher bist ob a > b ist, mach einfach ein ABS() drumrum.

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


Hier übrigends mal die entsprechenden "CodeSchnipsel" aus der DateUtils:
ausblenden 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...

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
barfuesser
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 324



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: 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).

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
maxk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: 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

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
barfuesser
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 324



BeitragVerfasst: 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