AGB  ·  Datenschutz  ·  Impressum  







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

DateTime-Subtraktionsproblem

Ein Thema von Dax · begonnen am 20. Dez 2004 · letzter Beitrag vom 21. Dez 2004
Antwort Antwort
Seite 1 von 2  1 2      
Dax
(Gast)

n/a Beiträge
 
#1

DateTime-Subtraktionsproblem

  Alt 20. Dez 2004, 16:37
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

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..
  Mit Zitat antworten Zitat
Maa83

Registriert seit: 7. Nov 2002
220 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: DateTime-Subtraktionsproblem

  Alt 20. Dez 2004, 16:57
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!
Martin
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.354 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: DateTime-Subtraktionsproblem

  Alt 20. Dez 2004, 17:01
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.
Peter
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: DateTime-Subtraktionsproblem

  Alt 20. Dez 2004, 17:04
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

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)]);
Andreas
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#5

Re: DateTime-Subtraktionsproblem

  Alt 20. Dez 2004, 17:04
ICh will ja die Zeitspanne zwischen den beiden Werten als TDateTime haben.. Da helfen mit String-Funktionen nicht weiter
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: DateTime-Subtraktionsproblem

  Alt 20. Dez 2004, 17:07
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: DateTime-Subtraktionsproblem

  Alt 20. Dez 2004, 17:13
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.
Andreas
  Mit Zitat antworten Zitat
Maa83

Registriert seit: 7. Nov 2002
220 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: DateTime-Subtraktionsproblem

  Alt 21. Dez 2004, 08:35
@shmia: Deinen Beitrag vergessen wir jetzt ganz schnell wieder
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!
Martin
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#9

Re: DateTime-Subtraktionsproblem

  Alt 21. Dez 2004, 09:02
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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#10

Re: DateTime-Subtraktionsproblem

  Alt 21. Dez 2004, 11:10
Zitat von Maa83:
@shmia: Deinen Beitrag vergessen wir jetzt ganz schnell wieder
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.
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:04 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