![]() |
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.. |
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! |
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. |
Re: DateTime-Subtraktionsproblem
Zitat:
Beispiel:
Delphi-Quellcode:
Wenn du eine Zeitdifferenz in Monaten und Jahren ausdrücken möchtest, kommst du schon in Schwierigkeiten;
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; 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)]); |
Re: DateTime-Subtraktionsproblem
ICh will ja die Zeitspanne zwischen den beiden Werten als TDateTime haben.. Da helfen mit String-Funktionen nicht weiter ;)
|
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 ;) |
Re: DateTime-Subtraktionsproblem
Zitat:
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. |
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! |
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. |
Re: DateTime-Subtraktionsproblem
Zitat:
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 12:27 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 by Thomas Breitkreuz