Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DateTime-Subtraktionsproblem (https://www.delphipraxis.net/36471-datetime-subtraktionsproblem.html)

Dax 20. Dez 2004 16:37


DateTime-Subtraktionsproblem
 
Hallo :)

Ich sitze hier schon seit ein paar Stunden an einem verzwickten Problem..

Ich habe zwei TDateTime-Werte, die ich subtrahieren will. Beim normalen Verfahen (dt1 - dt2) kommen aber leider fehlerhafte Werte. Die beiden Werte sind 20-12-2004 15:51 und 20-12-2004 16:00. Die Datums/Zeitdifferenz, die ich suche, ist offensichtlich 0-0-0 00:09. Allerdings sagt Delphi mir, die Datumsdifferenz sei 1899 Jahre :pale:

Wie kann ich nun die beiden Werte subtrahieren, dass 0-0-0 00:09 herauskommt?

PS: Ich brauche sowohl die Datumsdifferenz als auch die Zeitdifferenz..

Maa83 20. Dez 2004 16:57

Re: DateTime-Subtraktionsproblem
 
also eine Funktion die dir dies liefert weiss ich aus dem Stehgreif heraus nicht. Aber es gibt die Methoden:

SecondsBetween
MinutesBetween
HoursBetween
DaysBetween
MonthSpan
YearsBetween

daraus kannst du dir dann selber was basteln!

Jasocul 20. Dez 2004 17:01

Re: DateTime-Subtraktionsproblem
 
Ich habe das Gefühl, dass du in die falsche Richtung denkst.
Das Ergebnis, das du aus der Differenz bekommst, ist ein Datum im Sinne von von Tag, Monat, Jahr, Stunde und Minute. Also ein Zeitpunkt!
Es ist kein(!) "soviel Zeit(Jahre,MonateTage,Stunden,Minuten) ist vergangen".
Eventuell funktionert die Funktion DateTimeToStr. Habe ich aber nicht ausprobiert.

shmia 20. Dez 2004 17:04

Re: DateTime-Subtraktionsproblem
 
Zitat:

Zitat von Dax
Ich sitze hier schon seit ein paar Stunden an einem verzwickten Problem..

Ich habe zwei TDateTime-Werte, die ich subtrahieren will. Beim normalen Verfahen (dt1 - dt2) kommen aber leider fehlerhafte Werte. Die beiden Werte sind 20-12-2004 15:51 und 20-12-2004 16:00. Die Datums/Zeitdifferenz, die ich suche, ist offensichtlich 0-0-0 00:09. Allerdings sagt Delphi mir, die Datumsdifferenz sei 1899 Jahre :pale:

Wie kann ich nun die beiden Werte subtrahieren, dass 0-0-0 00:09 herauskommt?

PS: Ich brauche sowohl die Datumsdifferenz als auch die Zeitdifferenz..

Es gibt keine "Datumsdifferenz", sondern nur eine Differenz gemessen in Tagen und Bruchteilen von Tagen!!
Beispiel:
Delphi-Quellcode:
var
   dt1, dt2 : TDateTime;
   diff : Double;

   tage : integer;
   stunden : double;
begin
   diff := dt1 -dt2;

   ShowMessageFmt('Zeitdifferenz: %f Tage', [diff]);

   // man kann die Tage auch in Tage und Stunden zerbrechen:
   tage := trunc(diff);
   stunden := (diff - tage)*24.0;
   ShowMessageFmt('Zeitdifferenz: %d Tage & %f Stunden', [tage, stunden]);

   // man kann das Spiel weitertreiben und die Zeitdifferenz noch in Minuten und Sekunden aufbrechen
   // hausaufgabe :-)
end;
Wenn du eine Zeitdifferenz in Monaten und Jahren ausdrücken möchtest, kommst du schon in Schwierigkeiten;
denn wie lange soll der Monat sein (30 oder 31 Tage)?
Zeitdifferenzen zwischen 0.0 und 0.9999999999 kann man mit TimeToStr umwandeln,
bei grösseren (oder nagativen!!!) Differenzen muss man erst die ganzen Tage rausrechnen.
Delphi-Quellcode:
diff := Abs(diff);
tage := trunc(diff);
rest := int(diff);
   ShowMessageFmt('Zeitdifferenz: %d Tage & %s ', [tage, TimeToStr(rest)]);

Dax 20. Dez 2004 17:04

Re: DateTime-Subtraktionsproblem
 
ICh will ja die Zeitspanne zwischen den beiden Werten als TDateTime haben.. Da helfen mit String-Funktionen nicht weiter ;)

Dax 20. Dez 2004 17:07

Re: DateTime-Subtraktionsproblem
 
ICh will ja die Zeitspanne zwischen den beiden Werten als TDateTime haben.. Da helfen mit String-Funktionen nicht weiter ;)

[edit]

shmia: Ich meinte die Diefferenz in Tagen ;) Mittlerweile habe ich aber etwas gefunden: Ich nehme mir einfach die Tagesdifferenz und rechne selbst statt die DateUtils-Funktionen zu bemühen. Für die Zeit nehme ich dann DecodeTime ;)

shmia 20. Dez 2004 17:13

Re: DateTime-Subtraktionsproblem
 
Zitat:

Zitat von Dax
ICh will ja die Zeitspanne zwischen den beiden Werten als TDateTime haben.. Da helfen mit String-Funktionen nicht weiter ;)

Die Zeitspanne (=Differenz zweier TDateTime Werte) hat den Datentyp Double.
Die Zeitspanne wird in Tagen ausgedrückt. (20.12.2004 - 18.12.2004 = 2.0)
Du darfst die Zeitdifferenz nicht in einer Variablen vom Typ TDatetime speichern.
Der Kompiler hindert dich nicht daran; aber es wäre FALSCH.
Du darfst übrigens auch nicht 2 Datumswerte addieren. Das Ergebnis wäre schlichtweg Datenmüll.

Maa83 21. Dez 2004 08:35

Re: DateTime-Subtraktionsproblem
 
@shmia: Deinen Beitrag vergessen wir jetzt ganz schnell wieder :wink:
Man schaue in der Hilfe und da steht:

type TDateTime = type Double;

also ist es nicht falsch das ganze in einer TDateTime Varible zu speichern!

Jelly 21. Dez 2004 09:02

Re: DateTime-Subtraktionsproblem
 
dt1 ist kleiner als dt2, als kriegst du bei d1-d2 ein "negatives" Datum raus. Was Delphi daraus macht, hab ich keine Ahnung. Probiers mal umgekehrt, dt:=dt2-dt1.

Dann kannst du dir mit FormatDateTime ('hh:nn:ss',dt) die Stunden:Minuten:Sekunden anzeigen, und mit trunc(dt) die Anzahl der Tage.

Intern wird ein TDateTime so gehandhabt, daß was vor dem Komma steht, die Anzahl der Tage ist, gemessen ab einem bestimmten Anfangsdatum (1.1.1899 wenn ich mich richtig entsinne). Der Bruchteil wird dafür verwendet, die Stunden, Minuten, Sekunden und Millisekunden darzustellen. 12 Uhr mittags entspricht in dem Sinne 0,5.

Delphi bietet aber noch viele interessante Datumsfunktionen: DaysBetween, EncodeDate, DecodeDate... um nur einige zu nennen.

shmia 21. Dez 2004 11:10

Re: DateTime-Subtraktionsproblem
 
Zitat:

Zitat von Maa83
@shmia: Deinen Beitrag vergessen wir jetzt ganz schnell wieder :wink:
Man schaue in der Hilfe und da steht:

type TDateTime = type Double;

also ist es nicht falsch das ganze in einer TDateTime Varible zu speichern!

Ich glaube wir vergessen deinen Beitrag wieder! (du hast den Hintergrund nicht kapiert)

Fangen wir ganz unten an:
Es gibt Zeit und Raum. Wegstrecken dürfen subtrahiert werden; das Ergebnis ist wieder eine Wegstrecke:
800m-200m=600m
Wegstrecken dürfen addiert werden; das Ergebnis ist wieder eine Wegstrecke:
500m+600m=1100m
Zeit ist anderst geartet!!!
Es gibt Zeitpunkte (Datum&Uhrzeit) und Zeitdifferenzen (gemessen in Tagen, Stunden, sekunden,..)
Zeitpunkte dürfen subtrahiert werden; das Ergebnis ist eine Zeitdifferenz und kein Zeitpunkt mehr!!!
ZeitpunktA-ZeitpunktB = Zeitdifferenz

Zeitpunkte dürfen nicht addiert werden, das Ergebnis wäre Unsinn!!
Zeitdifferenzen dürfen dagegen addiert werden.

Schau man über den Tellerrand von Delphi hinaus, dann sieht man in einer C++ Klassenbibliothek
2 Klassen: CTime und CTimeSpan.
Es ist ein Schwachpunkt von Delphi, dass ein Zeitpunkt nur in einem Doublewert gespeichert wird
und dass es dagegen keine Kapselung in 2 Klassen gibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:49 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz