Datumdifferenz

Ich würde gerne ein C Programm schreiben das die Differenz zweier Datum errechnet!
Ich müsste dazu alles in Tage umrechnen habe aber ein problem bei der Umrechnung von den Monaten in Tage! Da jedes Monat eine unterschiedliche Anzahl an Tage hat! Weiters müsste ich die errechneten Tage wieder zurück wandeln um auf das Ergebnis in Tage:Monate:Jahre zu kommen!
Wenn wer einen einfachen Algorithmus dazu weiß würde mir das sehr helfen!
Liebe Grüße Kathi
Danke für eure Mithilfe

Ich würde gerne ein C Programm schreiben das die Differenz
zweier Datum errechnet!
Ich müsste dazu alles in Tage umrechnen habe aber ein problem
bei der Umrechnung von den Monaten in Tage! Da jedes Monat
eine unterschiedliche Anzahl an Tage hat! Weiters müsste ich
die errechneten Tage wieder zurück wandeln um auf das Ergebnis
in Tage:Monate:Jahre zu kommen!
Wenn wer einen einfachen Algorithmus dazu weiß würde mir das
sehr helfen!

Möchtest du die Umrechnung selbst vornehmen, so hast du dir ganz schön etwas vorgenommen. Um Operationen mit einem Datum auszuführen, beispielsweise Differenzen bilden oder das Addieren von Tagen, benötigst du einen angemessenen Datentypen. Dieser speichert i.d.R. die Anzahl der Tage seit Beginn der Epoche, beispielsweise seit dem Start des gregorianischen Kalenders. Mit einem solchen Typen lassen sich einfach Differenzen bilden. Um aus dieser Zahl das Jahr, den Monat und den Tag zu bestimmen, werden bekannte Formeln eingesetzt. (es gibt eine Reihe von Mathematikern, die sich mit diesem Problem beschäftigt haben).

Ich würde mir vorhandene Funktionen zu nutze machen, so gibt es in ANSI C die Funktion mktime, die dir eine vorgegebenes Datum in den Typ time_t konvertiert. time_t funktioniert (s.o.) wie ein Zähler, er speichert die Sekunden seit dem 1.1.1970.
Willst du die Differenz zweier Daten bilden, konvertierst du diese in den Typ time_t und erhälst somit jeweils die Sekunden seit dem 1.1.1970. Nun subtrahierst du den kleineren Wert vom Größeren und hast die Differenz der beiden Daten in Sekunden. Da du weisst, dass ein Tag 86400 Sekunden hat (24h*60m*60s) führst du eine Division durch und erhälst als Ergebnis die gesuchten Tage.

Du kannst übrigens auch Tage auf ein Datum addieren, dazu konvertierst du das Startdatum wieder nach time_t und addierst (tage*86400). Nun konvertierst du den time_t mit der Funktion gmtime zurück nach struct tm und hast wieder Tag,Monat und Jahr (struct tm speichert das aufgesplittete Datum).

Viel Spass, Markus

Hallo Katharina !

Dazu verwendet man am einfachsten die Julian Day Number - Berechnung:
Durch Umwandlung eines Datums in die sogenannte Julian Day Number kann man bequem Datumsberechnungen ausführen.
Die JDN gibt die Anzahl der Tage zwischen dem 1. Januar 4713 und einem Datum an (wobei natürlich alle Datumsangaben vor der Einführung des gregorianischen Kalenders rein theoretischer Natur sind :wink: )
Hier für unseren (den gregorianischen) Kalender:

Datum -\> JDN:

int iYear; // Jahr
int iMonth; // Month
int iDay; // Tag
int iJDN; // Julian Day Number
int iA;
int iY;
int iM;

if (iYear Datum:

int iYear; // Jahr
int iMonth; // Month
int iDay; // Tag
int iJDN; // Julian Day Number
int iH1, iH2, iH3, iH4, iH5, iH6;

iH1 = iJDN + 32045;
iH2 = ((4 \* (iH1 + 36524)) / 146097) - 1;
iH3 = iH1 - ((iH2 \* 146097) / 4);
iH4 = ((4 \* (iH3 + 365)) / 1461) - 1;
iH5 = iH3 - ((1461 \* iH4) / 4);
iH6 = ((5 \* (iH5 - 1)) + 2) / 153;
iDay = iH5 - (((153 \* iH6) + 2)) / 5;
iMonth = iH6 + 3 - (12 \* (iH6 / 10));
iYear = (iH2 \* 100) + iH4 - 4800 + (iH6 / 10);
if (iYear 

Es gibt natürlich auch algorithmen für den julianischen Kalender etc., die dürften aber eher selten gebraucht werden.

mfg
Christof


> <small>[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]</small>