Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Datumsdifferenz berechnen? (https://www.delphipraxis.net/178646-datumsdifferenz-berechnen.html)

ThaiSon96 19. Jan 2014 13:53

Datumsdifferenz berechnen?
 
Hallo,
ich soll ein Programm schreiben, dass die Tage bis zu den nächsten Ferien berechnen soll.
Dabei sollen Verbundtypen zwingend benutzt werden. Zudem ist der Funktionskopf vorgegeben. Bis jetzt sieht mein Programm so aus:
Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  tDatum = record
    Tag: 1..31;
    Monat: 1..12;
    Jahr: 2014..maxint;
  end; // of record

function tagebisferien (datumheute, datumferienbeginn: tDatum): integer;
begin
  result := (datumferienbeginn.Monat - datumheute.monat) * 31 + (datumferienbeginn.tag -  datumheute.Tag);
end;


var
  heute, ferien: tDatum;
  anzahl: integer;

begin
  writeln('[= Heutiges Datum =]');
  write('Tag: '); readln(heute.Tag);
  write('Monat: '); readln(heute.Monat);
  write('Jahr: '); readln(heute.Jahr);

  writeln('[= Feriendatum =]');
  write('Tag: '); readln(ferien.Tag);
  write('Monat: '); readln(ferien.Monat);
  write('Jahr: '); readln(ferien.Jahr);

  Anzahl := tagebisferien(heute, ferien);

  writeln('Es ist/sind noch ',abs(anzahl),' Tag/Tage bis zu den naechsten Ferien');
  readln;
end.
Ich bin mir nicht sicher ob das richtig ist. Dass nicht jeder Monat 31 Tage hat, ist mir dabei bewusst! ;)
Auf jede Antwort würde ich mich freuen,
Gruß

haentschman 19. Jan 2014 13:56

AW: Datumsdifferenz berechnen?
 
Moin... 8-)
Das einfachste dürfte http://docwiki.embarcadero.com/Libra...ls.DaysBetween sein.
PS: Was sind Verbundtypen?

Sir Rufo 19. Jan 2014 13:58

AW: Datumsdifferenz berechnen?
 
Mit Verbundtyp ist das
Delphi-Quellcode:
tDatum
gemeint (ungewöhnlicher Name)

haentschman 19. Jan 2014 13:59

AW: Datumsdifferenz berechnen?
 
Ach der Record... :roll: Für ein Datum eh ein ungewöhnliches Format. Wer gibt solche Vorgaben? Ein Lehrer?

Sir Rufo 19. Jan 2014 14:03

AW: Datumsdifferenz berechnen?
 
Zitat:

Zitat von haentschman (Beitrag 1244351)
Ach der Record... :roll: Für ein Datum eh ein ungewöhnliches Format. Wer gibt solche Vorgaben? Ein Lehrer?

Und? Damit erzwingt man eine andere Lösung als das Verwenden von DateUtils.
Hängt davon ab, was man gerade vermitteln möchte.

Pauschales Lehrer-Bashing, weil die ja nicht nachdenken, ohne Vor- und Nachdenken :roll:

Furtbichler 19. Jan 2014 14:15

AW: Datumsdifferenz berechnen?
 
Eben, es ist nämlich nicht so leicht, das zu berechnen. Vor allen Dingen lernt man, zu programmieren, da die Lösung des Problems andere Datenstrukturen, Formeln, bedingte Verzweigungen, Schleifen und im günstigsten Fall den Aufruf anderer Funktionen beinhaltet.

Vielleicht sollte der Fragesteller einfach mal erklären, wie er das mit Papier und Bleistift ausrechnen würde. Denn da nicht alle Monate 31 Tage haben, ist der bisherige Code zwar ein Anfang, aber noch nicht die Lösung.

Also: Erst in Deutsch formulieren, wie man das machen würde, dann schauen wir weiter.

arnof 19. Jan 2014 18:37

AW: Datumsdifferenz berechnen?
 
Tage=Ferienbeginn -now;

Ferienbeginn muss einfach ein TDate sein!

Ich verstehe das Problem garnicht:?::?:

Das funktioniert

Furtbichler 19. Jan 2014 18:42

AW: Datumsdifferenz berechnen?
 
Zitat:

Zitat von arnof (Beitrag 1244423)
Tage=Ferienbeginn -now;
Ferienbeginn muss einfach ein TDate sein!
Ich verstehe das Problem garnicht:?::?:
Das funktioniert

Es geht darum, die auf der ersten Seite im ersten Post gemachten Vorgaben eben *nicht* zu ignorieren. Ich postuliere, das dies zu massivem Punktabzug führt. Stichwort: Schüler, Schule, Lehrer, Aufgabe, Vorgabe. Das ist eine Programmieraufgabe, die das Programmieren schulen soll.

sx2008 19. Jan 2014 18:57

AW: Datumsdifferenz berechnen?
 
Du bräuchtest eine Funktion, die dir sagt ob ein bestimmtes Jahr ein Schaltjahr ist.
Delphi-Quellcode:
function IstSchaltJahr(jahr:Integer):Boolean;
begin
   ...
Falls nur die Ferien im aktuellen Jahr berücksichtigt werden, kann man das Schaltjahrthema natürlich ignorieren.

Dann braucht du ein Array (oder eine Funktion) die für jeden Monat (1..12) die Anzahl der Tage liefert.

Die Dinge, die ich hier angesprochen habe sind auch etwas versteckt in der VCL/RTL von Delphi zu finden, aber ich würde es selbst programmieren.

arnof 19. Jan 2014 19:46

AW: Datumsdifferenz berechnen?
 
Zitat:

Zitat von Furtbichler (Beitrag 1244427)
Zitat:

Zitat von arnof (Beitrag 1244423)
Tage=Ferienbeginn -now;
Ferienbeginn muss einfach ein TDate sein!
Ich verstehe das Problem garnicht:?::?:
Das funktioniert

Es geht darum, die auf der ersten Seite im ersten Post gemachten Vorgaben eben *nicht* zu ignorieren. Ich postuliere, das dies zu massivem Punktabzug führt. Stichwort: Schüler, Schule, Lehrer, Aufgabe, Vorgabe. Das ist eine Programmieraufgabe, die das Programmieren schulen soll.

Ok wenn man es manuell rechnen muss, dann mag das anders sein. Mein Beispiel macht das richtig inclusive. Schaltjahr usw. Ich müsste in meinen Code Anfang der 1990 er schauen, da musste ich das auch noch ausrechnen. Seit Delphi 1 geht das wie ich es beschrieben habe.

Sheila Mertens 20. Jan 2014 08:59

AW: Datumsdifferenz berechnen?
 
Eine methode um die Tage zwischen zwei verschiedene Datums zu berechnen ist, die zwei Datums zuerst um zu setzen in Julianischer Datum. Dazu sind auf dem Internet verschiedene Algoritmen zu finden.

Jumpy 20. Jan 2014 09:34

AW: Datumsdifferenz berechnen?
 
Zitat:

Zitat von sx2008 (Beitrag 1244435)
Falls nur die Ferien im aktuellen Jahr berücksichtigt werden, kann man das Schaltjahrthema natürlich ignorieren.

Nee, denke das bleibt schon ein Thema. Wenn man am 5.1. wissen will wie lange es noch bis zu den Osterferien am 12.3. ist, wäre die Info Schaltjahr oder nicht schon wichtig.

Sheila Mertens 20. Jan 2014 15:25

AW: Datumsdifferenz berechnen?
 
Ich hatte heute Morgen nicht viel Zeit, also jetzt ein Vorbild zur Berechnung Julianischer Datum.

Die Procedure JulianDate braucht als Input: Jahr, Monat und Tag. Der Tag muss aber dezimal eingegeben werden, dazu dient die Function DHMStoDReal. Naturlich kann mann die Berechnung auch zuruckarbeiten, dazu dient die Procedure DateFromJD, die den Tag wieder in Dezimal abliefert. Um dies wieder um zu setzen in Tag, Stunden, Minuten und Sekunden bracht mann DRealToDHMS.

(Code entfernt)

himitsu 20. Jan 2014 15:34

AW: Datumsdifferenz berechnen?
 
Zitat:

Zitat von Sheila Mertens (Beitrag 1244495)
Eine methode um die Tage zwischen zwei verschiedene Datums zu berechnen ist, die zwei Datums zuerst um zu setzen in Julianischer Datum. Dazu sind auf dem Internet verschiedene Algoritmen zu finden.

Anders ausgedrückt, man braucht einen Datums-Typ, welcher die Zeit in nur einer Einheit (Tage, Stunden oder Sekunden) in Relation zu einem festen Datum liefert.

Ob es nun ein Julian-Date ist, oder ein TDateTime oder ein Unit-Timestamp, ist dabei egal.
Das Ergbnis sind zwei einzelne Zahlen, mit denen man direkt rechnen kann. Und zum Schluß muß man das Ergebnis eventuell nur noch in eine Zeiteinheit umrechnen, welche man benötigt.
Für viele Datums-Zeitformate gibt es im Delphi schon fertige Umrechnungsfunktionen.



Man kann das natürlich auch manuell direkt über die drei Werte Jahr/Monat/Tag berechnen, aber muß da natürlich die Anzahl der Tage pro Monat und die Schaltjahre entsprechend berücksichtigen.

baumina 20. Jan 2014 15:40

AW: Datumsdifferenz berechnen?
 
Zitat:

Zitat von Sheila Mertens (Beitrag 1244564)
Ich hatte heute Morgen nicht viel Zeit, also jetzt ein Vorbild zur Berechnung Julianischer Datum.

Oder man schaut sich die Sourcen in DateUtils.pas an. Z.B.:

Delphi-Quellcode:
function DateTimeToJulianDate(const AValue: TDateTime): Double;
var
  LYear, LMonth, LDay: Word;
begin
  DecodeDate(AValue, LYear, LMonth, LDay);
  Result := (1461 * (LYear + 4800 + (LMonth - 14) div 12)) div 4 +
            (367 * (LMonth - 2 - 12 * ((LMonth - 14) div 12))) div 12 -
            (3 * ((LYear + 4900 + (LMonth - 14) div 12) div 100)) div 4 +
            LDay - 32075.5 + Abs(Frac(AValue));
end;

Mikkey 20. Jan 2014 15:56

AW: Datumsdifferenz berechnen?
 
Zitat:

Zitat von baumina (Beitrag 1244568)
Zitat:

Zitat von Sheila Mertens (Beitrag 1244564)
Ich hatte heute Morgen nicht viel Zeit, also jetzt ein Vorbild zur Berechnung Julianischer Datum.

Oder man schaut sich die Sourcen in DateUtils.pas an. Z.B.:

... oder man strengt eine Minute lang seine kleinen grauen Zellen an, um dabei nicht die Aufgabenstellung aus den Augen zu verlieren:

Es geht hier ums Selbermachen!

@Sheila: Nichts für ungut, aber dieser "Algorithmus ist overkill für die gestellte Aufgabe (Er soll in die Zukunft rechnen, nicht zurück ins 16. Jahrhundert), außerdem strotzt er von Antipatterns. Zu gebrauchen ist er somit allenfalls als schlechtes Beispiel.

p80286 20. Jan 2014 16:42

AW: Datumsdifferenz berechnen?
 
Zitat:

Zitat von Mikkey (Beitrag 1244570)
@Sheila: Nichts für ungut, aber dieser "Algorithmus ist overkill für die gestellte Aufgabe (Er soll in die Zukunft rechnen, nicht zurück ins 16. Jahrhundert), außerdem strotzt er von Antipatterns. Zu gebrauchen ist er somit allenfalls als schlechtes Beispiel.

Wie wäre es, konkret die Schwachstellen zu benennen?

Gruß
K-H

Sheila Mertens 20. Jan 2014 19:10

AW: Datumsdifferenz berechnen?
 
Ach, ich versteh' schon, nicht 'danke Sheila fur die Muhe' oder zumindest 'wilkommen auf's Forum', nein, sofort abschiessen. Na dann, viel Spass mit dem Algoritmus, ich werde mir wohl zweimal bedenken eh ich hier wieder etwas schreibe. Tsk.

gb0 20. Jan 2014 20:04

AW: Datumsdifferenz berechnen?
 
Hier wird nicht (ab)geschossen! Ganz bestimmt nicht, wenn sich jemand um Hilfestellung bemüht.

@Sheila: Bitte nicht traurig oder gar böse sein. Das mit dem 'Willkommen im Forum' hole ich jetzt nach!

Der wesentliche Punkt ist jedenfalls
Zitat von himitsu #14
Zitat:

Ob es nun ein Julian-Date ist, oder ein TDateTime oder ein Unit-Timestamp, ist dabei egal.
Das Ergebnis sind zwei einzelne Zahlen, mit denen man direkt rechnen kann.
Gruß

Günther

Furtbichler 20. Jan 2014 20:23

AW: Datumsdifferenz berechnen?
 
Also als Programmieranfänger könnte ich mit einer für mich unverständlichen Umrechnung in eine Zahl nun überhaupt nichts anfangen. Also frage ich mich, inwiefern das hier zielführend ist.

Ja gut, der Fragesteller hat sich bisher auch nicht mehr gemeldet, insofern könnt ihr hier auch einfach weitermachen. :roll:

nahpets 20. Jan 2014 23:45

AW: Datumsdifferenz berechnen?
 
Hatte gerade mal ein bisserl Langeweile und das ist dabei rausgekommen:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, DateUtils;

type
  tDatum = record
    Tag: 1..31;
    Monat: 1..12;
    Jahr: 2014..maxint;
  end; // of record

// Tabelle für die Aufnahme der Anzahl der Tage pro Monat.
type
  tMonate = Array [1..12] of byte;

// Ein Schaltjahr ist jedes Jahr, das ohne Rest durch 4 teilbar ist.
// Keine Regel ohne Ausnahme:
// 1. Ausnahme: Es ist kein Schaltjahr, wenn es durch 100 ohne Rest teilbar ist.
// 2. Ausnahme = 1. Ausnahme von 1. Ausnahme:
// Es ist ein Schaltjahr, wenn es durch 400 ohne Rest teilbar ist.
function IstSchaltjahr(jahr : Integer) : Byte;
begin
       if jahr mod 400 = 0 then Result := 1
  else if jahr mod 100 = 0 then Result := 0
  else if jahr mod   4 = 0 then Result := 1
  else Result := 0;
end;

function tagebisferien (datumheute, datumferienbeginn: tDatum): integer;
var
         i              : Integer;
         Summe          : Integer;
         JahresDifferenz : Integer;
         MonateHeute    : tMonate;
         MonateFerien   : tMonate;
         ResttageHeute  : Integer;
begin
  // Tabelle mit den monatlichen Tageszahlen für das Jahr zu Heute.
  MonateHeute[1] := 31;
  MonateHeute[2] := 28 + IstSchaltjahr(datumheute.Jahr);
  MonateHeute[3] := 31;
  MonateHeute[4] := 30;
  MonateHeute[5] := 31;
  MonateHeute[6] := 30;
  MonateHeute[7] := 31;
  MonateHeute[8] := 31;
  MonateHeute[9] := 30;
  MonateHeute[10] := 31;
  MonateHeute[11] := 30;
  MonateHeute[12] := 31;

  // Tabelle mit den monatlichen Tageszahlen für das Jahr des Ferienbeginns.
  MonateFerien[1] := 31;
  MonateFerien[2] := 28 + IstSchaltjahr(datumFerienBeginn.Jahr);
  MonateFerien[3] := 31;
  MonateFerien[4] := 30;
  MonateFerien[5] := 31;
  MonateFerien[6] := 30;
  MonateFerien[7] := 31;
  MonateFerien[8] := 31;
  MonateFerien[9] := 30;
  MonateFerien[10] := 31;
  MonateFerien[11] := 30;
  MonateFerien[12] := 31;

  // Restliche Tage bis zum Ende des aktuellen Monats berechnen.
  ResttageHeute := MonateHeute[datumheute.Monat] - datumheute.Tag;

  // Summe der Tage berechnen.
  Summe := 0;
  // Das heutige Datum und das Datum des Ferienbeginns liegen im gleichen Jahr:
  if datumheute.Jahr = datumferienbeginn.Jahr then begin
    // Sind Heute und Ferienbeginn im gleichen Monat?
    if datumheute.Monat = datumferienbeginn.Monat then begin
      // Dann benötigen wir nur die Differenz zwischen Ferienbeginn und heute,
      // dabei gilt der angegebene Tag als Teil der Ferien, wir dürfen
      // also nur bis zum Tag davor rechnen.
      Summe := datumferienbeginn.Tag - datumheute.Tag - 1;
    end else begin
      // Andernfalls:
      // Zuerst die restlichen Tage des Monats zu Heute:
      Summe := Summe + ResttageHeute;
      // Tage vom Folgemonat bis zum Monat vor dem Ferienbeginn berechnen.
      for i := datumheute.Monat + 1 to datumferienbeginn.Monat - 1 do begin
        Summe := Summe + MonateHeute[i];
      end;
      // Die Tage des Monates, in den der Ferienbeginn fällt hinzurechnen,
      // dabei gilt der angegebene Tag als Teil der Ferien, wir dürfen
      // also nur bis zum Tag davor rechnen.
      Summe := Summe + datumferienbeginn.Tag - 1;
    end;
  end else begin
    // Der Ferienbeginn liegt im Folgejahr oder später:
    // Zuerst die restlichen Tage des Monats zum heutigen Datum:
    Summe := Summe + ResttageHeute;
    // Die Tage ab dem nächsten Monat bis zum Jahresende berechnen:
    for i := datumheute.Monat + 1 to 12 do begin
      Summe := Summe + MonateHeute[i];
    end;
    // Wieviele Jahre liegen zwischen Heute und dem Ferienbeginn?
    JahresDifferenz := datumferienbeginn.Jahr - datumheute.Jahr;
    if JahresDifferenz > 1 then begin
      // Für alle Jahre zwischen Heute und Ferienbeginn
      // 365 + ggls. 1 für das Schaltjahr addieren:
      for i := datumheute.Jahr + 1 to datumferienbeginn.Jahr - 1 do begin
        Summe := Summe + 365 + IstSchaltjahr(i);
      end;
    end;
    // Die Tage vom 1.1. bis zum Monat vor dem Ferienbeginn addieren:
    for i := 1 to datumferienbeginn.Monat - 1 do begin
      Summe := Summe + MonateFerien[i];
    end;
    // Und nun noch die Tage des Monats in den der Ferienbeginn fällt
    // bis zum Tag vor dem Ferienbeginn.
    Summe := Summe + datumferienbeginn.Tag - 1;
  end;
  Result := Summe;
end;

var
  heute, ferien: tDatum;
  anzahl: integer;

begin
  writeln('[= Heutiges Datum =]');
  write('Tag: '); readln(heute.Tag);
  write('Monat: '); readln(heute.Monat);
  write('Jahr: '); readln(heute.Jahr);

  writeln('[= Feriendatum =]');
  write('Tag: '); readln(ferien.Tag);
  write('Monat: '); readln(ferien.Monat);
  write('Jahr: '); readln(ferien.Jahr);

  Anzahl := tagebisferien(heute, ferien);

  writeln('Es ist/sind noch ',abs(anzahl),' Tag/Tage bis zu den naechsten Ferien.');
  WriteLn;
  // Gegenprobe per Datumsberechnung mit "Delphi-Mitteln":
  // Die Gegenprobe funktioniert allerdings "nur" bis zum 31.12.9999,
  // danach können Fehler auftreten (negativ Anzahl von Tagen)
  // oder die Anzahl der Tage wird deutlich zu klein angegeben ;-)
  WriteLn(Format('Gegenprobe mit Datumsroutinen: %d',[Trunc(
      StrToDateTime(Format('%d.%d.%d',[ferien.Tag,ferien.Monat,ferien.Jahr]))
    - StrToDateTime(Format('%d.%d.%d',[heute.Tag,heute.Monat,heute.Jahr]))
    - 1)]));
  readln;
end.
Natürlich lässt sich da noch so einiges zusammenfassen und verschöneren...
aber so als Idee für's erste Lernen könnte es ja unter Umständen eventuell vielleicht hilfreich sein und wenn auch nur als abschreckendes Beispiel ;-)

Furtbichler 21. Jan 2014 06:09

AW: Datumsdifferenz berechnen?
 
Was ist denn, wenn ich mehr als 1 Jahr zwischen den beiden Datumsen habe?

Also ich würde das dann so machen (ungetestet):
Delphi-Quellcode:
Function IstEinSchaltjahr(jahr : Integer) : Bool;
begin
        if jahr mod 400 = 0 then Result := 1
   else if jahr mod 100 = 0 then Result := 0
   else if jahr mod 4 = 0 then Result := 1
   else Result := 0;
end;

Function TageImMonat (Monat, Jahr : Integer) : Integer;
Begin
  Case Monat of
    1,3,5,7,8,10,12 : Result := 31;
    4,6,8,10 : Result := 30;
    2 : If IstEinSchaltHahr(Jahr) then
      Result := 29 
    else
      Result := 28;
   end
end;
 
Function AnzahlTage (A,B : TDatum) : Integer;
Begin
  If (A.Jahr=B.Jahr) and (A.Monat=B.Monat) then
    result := B.Tag - A.Tag;
    exit;
  end;
  L := A;
// 1. Alle Tage bis zum Monatsende...
  Result := TageImMonat(L.Monat, L.Jahr) - A.Tage;
// 2. Dann alle Monate bis zum Ferienbeginn zusammenzählen
  While (L.Jahr<>B.Jahr) and (L.Monat <> B.Monat) Do Begin
    if L.Monat=12 then begin
      L.Jahr := L.Jahr +1 ;
      L.Monat := 1;
    end
    else L.Monat := L.Monat + 1;
    Result := Result + TageImMonat(L.Monat, L.Jahr);
  end;
// 3. Zum Schluss noch die Tage vom Ferienmonat
  Result := Result + B.Tage;
End;

baumina 21. Jan 2014 06:17

AW: Datumsdifferenz berechnen?
 
Zitat:

Zitat von Furtbichler (Beitrag 1244624)
Was ist denn, wenn ich mehr als 1 Jahr zwischen den beiden Datumsen habe?

Mehr als ein Jahr liegt eh nie zwischen den Ferien :-D

himitsu 21. Jan 2014 10:00

AW: Datumsdifferenz berechnen?
 
Zitat:

Zitat von baumina (Beitrag 1244625)
Mehr als ein Jahr liegt eh nie zwischen den Ferien :-D

In der Überschrift ist aber nicht nur von Ferien die Rede.

Ich glaub aber die While-Schleife ist falsch, denn dort wird scheinbar ein Monat zu viel eingerechnet.

- vor der Schleife den Monat erhöhen
- und das
Delphi-Quellcode:
Result := Result + ...
an den Anfang der Schleife, bevor dort der Monat erhöt wird

Oder die Schleife muß einen Monat früher aufhören, also noch mal die Abbruchbedingung (mit
Delphi-Quellcode:
if then break;
) nach dem Erhöhen des Monats, bevor Addiert wird.

PS: Warum BOOL (Integer) und nicht Boolean (Byte und der Standardtyp im Delphi) ?
PPS: Warum Integer Zahlen als Result, obwohl es Boolean sein sollten?

Notfalls sollte man auch B vor A abfangen, denn sonnst läuft deine Schleife ein Weilchen. (Byte+Integer = bis zu 1.099.511.627.775 Durchläufe)
- Dieses erkennen und eine Exception werfen
- Dieses erkennen und einen "Fehler"-Wert zurückgeben (z.B. -1 oder MinInt)
- Dieses erkennen, die Werte austauschen, das Minus merken und am Ende das Result umdrehen (
Delphi-Quellcode:
Result := -Result;
)
- erkennen, austauschen, -1 oder 1 merken und am Ende damit multiplizieren

ThaiSon96 22. Jan 2014 19:04

AW: Datumsdifferenz berechnen?
 
Habe das Programm inzwischen geschafft

Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  tMonat = array [1..12] of integer;
  tDatum = record
    Tag: 1..31;
    Monat: 1..12;
    Jahr: 2014..maxint;
  end; // of record

var
  heute, ferien: tDatum;
  monate : tmonat = (31,29,31,30,31,30,31,31,30,31,30,31);
  tage: integer;

function tagebisferien (datumheute, datumferienbeginn: tDatum): integer;
var
  verbleibendetage: integer;
begin
  verbleibendetage := 0;
  if datumheute.monat <> datumferienbeginn.Monat then
  begin
    verbleibendetage := verbleibendetage + (monate[datumheute.monat] - datumheute.Tag);
    datumheute.monat :=datumheute.monat +1;
    while (datumheute.Monat <> datumferienbeginn.monat) do
    begin
      verbleibendetage := verbleibendetage + (monate[datumheute.Monat]);
      datumheute.monat := datumheute.monat +1;
    end;
    verbleibendetage := verbleibendetage + datumferienbeginn.tag;
  end
  else verbleibendetage := datumferienbeginn.tag - datumheute.tag;
  result := verbleibendetage;
end;




begin                                            
  writeln('[= Heutiges Datum =]');
  write('Tag: '); readln(heute.Tag);
  write('Monat: '); readln(heute.Monat);
  write('Jahr: '); readln(heute.Jahr);

  writeln('[= Feriendatum =]');
  write('Tag: '); readln(ferien.Tag);
  write('Monat: '); readln(ferien.Monat);
  write('Jahr: '); readln(ferien.Jahr);

  if (heute.Tag > ferien.Tag) AND (heute.Monat > ferien.Monat) AND (heute.Jahr = ferien.Jahr) then
    writeln('Ungueltige Angaben!')
  else
  begin
    tage := tagebisferien(heute, ferien);
    writeln('Es ist/sind noch ',abs(tage),' Tag/Tage bis zu den naechsten Ferien');
  end;

  readln;
end.

Furtbichler 22. Jan 2014 20:19

AW: Datumsdifferenz berechnen?
 
Sehr gut!
Aber was ist, wenn das Jahr kein Schaltjahr ist?

Furtbichler 22. Jan 2014 20:24

AW: Datumsdifferenz berechnen?
 
Zitat:

Zitat von himitsu (Beitrag 1244653)
Ich glaub aber die While-Schleife ist falsch, denn dort wird scheinbar ein Monat zu viel eingerechnet.
- vor der Schleife den Monat erhöhen

Jupp, aber mehr muss nicht sein, oder?. War ja nur ne Idee in Delphi#.
Die ganzen Abfragen kann man noch einbauen, aber ich mach ja nicht alle Hausarbeiten.

Sir Rufo 22. Jan 2014 21:10

AW: Datumsdifferenz berechnen?
 
Es ist noch ein Fehler in der Gültigkeitsabfrage
Code:
Heute: [FerienTag+x].[FerienMonat].[FerienJahr]
Also gleiches Jahr, gleicher Monat und der heutige Tag größer als der Ferientag :)

bcvs 23. Jan 2014 07:02

AW: Datumsdifferenz berechnen?
 
In deiner while-Schleife zählst du die Monate hoch. Da wird aber ein Jahreswechsel nicht berücksichtigt. Überleg mal, was passiert, wenn du am 31.12 wissen willst, viele Tage es noch bis zu den Faschingsferien sind.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:36 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