AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Genauer(!) Unterschied von zwei TDateTimes
Thema durchsuchen
Ansicht
Themen-Optionen

Genauer(!) Unterschied von zwei TDateTimes

Ein Thema von Fussball-Robby · begonnen am 5. Jun 2009 · letzter Beitrag vom 6. Jun 2009
Antwort Antwort
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#1

Genauer(!) Unterschied von zwei TDateTimes

  Alt 5. Jun 2009, 18:56
Hey,
ich erinnere mich daran, hier schonmal eine Diskussion darüber gelesen zu haben, finde sie aber nicht mehr.
Undzwar möchte ich den Unterschied zweier TDateTime-Werte berechnen und dann Die vergangenen Jahre, Monate [..] und Sekunden anzeigen. Und das muss absolut genau sein. Jetzt ergibt sich aber das Problem, dass in der Unit DateUtils der Monatsunterschied mit eine konstanten Anzahl Tage pro Monat berechnet wird (30.4375). Dadurch wird die Berechnung an Monatswechseln allerdings teilweise verfälscht. Gibt es eine fertige Lösung zur genauen Berechnung oder muss ich das selbst implementieren?
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Genauer(!) Unterschied von zwei TDateTimes

  Alt 5. Jun 2009, 18:58
Ja in den DateUtils werden Funktionen dafür angeboten
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Genauer(!) Unterschied von zwei TDateTimes

  Alt 5. Jun 2009, 19:00
Zitat von mkinzler:
Ja in den DateUtils werden Funktionen dafür angeboten
Welche denn? Falls du MonthsBetween meinst: Das ruft MonthSpan auf, und dieses rechnet mit dem angesprochenen Durchschnittswert.
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#4

Re: Genauer(!) Unterschied von zwei TDateTimes

  Alt 6. Jun 2009, 00:36
Zitat von Fussball-Robby:
Zitat von mkinzler:
Ja in den DateUtils werden Funktionen dafür angeboten
Welche denn? Falls du MonthsBetween meinst: Das ruft MonthSpan auf, und dieses rechnet mit dem angesprochenen Durchschnittswert.
Hallo,

die haben halt etwas weiter gedacht als du: ein Zeitunterschied in Monaten hat eben keinen Bezug zu realen Monaten wie Februar mit 28 und März mit 31 Tagen. Die Angabe "Zeitunterschied 5 Monate" lässt völlig offen, wieviele Monate mit 28,29,30 oder 31 Tagen da drin sind. Wenn man es genau nehmen will, kann man daraus nur den Schluss ziehen, dass eine Monatsangabe als Differenz undefiniert ist und man eine genaue Zeitdifferenz nur in Tagen angeben kann, oder man nimmt eben eine durchschnittliche Monatsdauer als best fit.

Nicht immer alle anderen für blöd halten.

Gruss Reinhard
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Genauer(!) Unterschied von zwei TDateTimes

  Alt 6. Jun 2009, 01:05
Es ist doch auch nicht nötig, für die Berechnung einer Einheit, die enthaltenen kleineren Einheiten zu kennen. Für die Berechnung der Tage ist es doch auch völlig unwichtig, wie viele Stunden ein Tag hat.

Ermitteln der ganzen Jahre... mit Rest ermitteln wie viele ganze Monate... mit Rest ermitteln wie viele ganze Tage (ab 1. des letzten angebrochenen Monats)... mit Rest ermitteln wie viele ganze Stunden...usw.

Ganz klar, der Monat ist keine Konstante sondern ein variabler Wert... selbst wenn die Monate genau zurückgerechnete werden, lässt sich nur der ganzzahlige Anteil genau bestimmen, der Nachkommawert wäre immer relativ (zu 28,29,30 oder 31 Tagen)

Außerdem das nächste Problem... 2. Januar bis 27 Februar. Ist das Jetzt ein Monat + Tage, auch wenn kein ganzer Monat eingeschlossen ist oder ist das 0 Monate und 57 Tage? Die gleiche Überlegung kommt dann bei "halben" Jahren und Schaltjahren auf.

Genauer Unterschied geht also nur in Tagen und Stunden, größere konstante Einheiten gibt es beim Datum nicht. Monat, Jahr, Jahrhundert sind variable Werte und ungeeignet zum Ausdrücken eines genauen Wertes.

***

1 Km = 1000 m / 1m = 1000mm, das sind Konstante Einheiten

Wäre auf der Autobahn 1 Km = 900m und auf der Landstraße 1 Km = 1100m, dann lies sich die Gesamtstrecke auch nicht genau in km angeben. Man müsste dann sagen x Km Autobahn + y Km Landstraße oder die Strecke in der ersten kontanten Einheit Meter angeben.

***

Mal ein Ansatz, wie ich mir das vorstelle:
Delphi-Quellcode:
function DateTimeStrBetween(StartDT, EndDT : TDateTime):String;
var
  Years, Months, Days,
  Year1, Month1, Day1,
  Year2, Month2, Day2: Word;
begin
  DecodeDate(StartDT, Year1, Month1, Day1);
  DecodeDate(EndDT, Year2, Month2, Day2);
  // Stunden, Minuten etc. darf berechnen wer will

  Days := (DateUtils.DaysInAMonth(Year1, Month1)-Day1) + Day2;
  // was machen wir mit mehr als 27 Tagen? Monat ist kein konstanter Wert

  Months := (12 - Month1) + (Month2 -1);
  // Auch hier mehr als 12 Monate möglich, aber Jahr = 12 Monate ist eine Konstante

  Years := Year2 - Year1 -1;
  if SmallInt(Years) < 0 then Years := 0;
  // wer also keine 13 Monate sehen will, auch wenn darin kein ganzes Jahr ist:
  // mathematisch logischer wäre aber, nachfolgende Berechnung nicht zu machen
  Years := Years + (Months div 12);
  Months := Months mod 12;

  Result := Format('%d Jahre, %d Monate, %d Tage',[Years, Months, Days]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := DateTimeStrBetween(DateTimePicker1.Date, Now);
end;
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Genauer(!) Unterschied von zwei TDateTimes

  Alt 6. Jun 2009, 07:18
Hab auch einen:
Delphi-Quellcode:
uses
  SysUtils, DateUtils, Math;

Type
  TDateDiff = (dfYears, dfMonths, dfDays, dfHours, dfMinutes, dfSeconds);

Const
  sDateDiff : Array [TDateDiff] Of String =
    ('Jahre','Monate','Tage','Stunden','Minuten','Sekunden');

Function DateDiffStr (aDateTime1, aDateTime2 : TDateTime) : String;
Var
  d : TDateDiff;
  n : Integer;
  days : Extended;

  Function _DaysInSection (aDateDiff : TDateDiff) : Extended;
  Begin
    case aDateDiff of
      dfYears:
        Result := DateUtils.DaysInYear(aDateTime1);
      dfMonths:
        Result := DateUtils.DaysInMonth(aDateTime1);
      dfDays:
        Result := DateUtils;
      dfHours:
        Result := DateUtils.OneHour;
      dfMinutes:
        Result := DateUtils.OneMinute;
      dfSeconds:
        Result := DateUtils.OneSecond;
    end;
  End;

Begin
  aDateTime2 := aDateTime2 + 1/(2*DateUtils.OneSecond);
  Result := '';
  For d:=Low (TDateDiff) To High (TDateDiff) Do Begin
    n := 0;
    days := _DaysInSection(d);
    While days + aDateTime1 <= aDateTime2 Do Begin
      inc(n);
      aDateTime1 := aDateTime1 + days;
    days := _DaysInSection(d);
    End;
    If n>0 Then
      Result := Format ('%s %d %s ',[Result, n, sDateDiff[d]]);
  End;
End;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


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