Unterschied zwischen 2 datumswerten in tagen berechnen



  • wie schon der titel sagt, möchte ich den unterschied zwischen datum 2 und datum 2 berechnen. habe dazu auch ein programm geschrieben, dieses funktioniert aber nicht: 😕

    #include<stdio.h>

    int main(){

    int gebJ=2000, gebM=7, gebT=27;
    int aktJ=2000, aktM=7, aktT=28;
    int zaehl=0, mzaehl;

    while((gebJ<aktJ) || (gebJ<=aktJ && gebM<aktM)){

    if(((gebJ%4==0) && (gebJ%100!=0) ) || (gebJ%400==0)){
    zaehl+=366; //wenn schaltjahr
    }
    else{
    zaehl+=365;
    }
    gebJ++;
    }

    mzaehl=aktM-gebM;

    while((mzaehl<aktM) || (mzaehl<=aktM && gebT<aktT)){

    switch(gebM){

    case 1: zaehl+=31; break;
    case 2: zaehl+=28; break;
    case 3: zaehl+=31; break;
    case 4: zaehl+=30; break;
    case 5: zaehl+=31; break;
    case 6: zaehl+=30; break;
    case 7: zaehl+=31; break;
    case 8: zaehl+=31; break;
    case 9: zaehl+=30; break;
    case 10: zaehl+=31; break;
    case 11: zaehl+=30; break;
    case 12: zaehl+=31; break;
    }
    mzaehl++;
    }

    while(gebT<=aktT){

    zaehl++;
    gebT++;
    }
    printf("%d", zaehl);

    return 0;
    }

    Kann mir jemand bitte helfen?

    MFG
    uncannysnake



  • also zur ersten schleifenbedingung: wenn gebJ gleich aktJ ist, dann muss die schleife doch gar nicht durchlaufen werden, da der unterschied in tagen kleiner als 365 ist.
    dann würde ich eine funktion schreiben, die auf ein schaldjahr prüft. was passiert, wenn gebJ aus irgend einen grund größer als aktJ ist?
    so zu den monaten: was passiert, wenn du folgende daten hättest: 15.3.2000 und 16.2.2001? in der ersten schleife würdest du schon plus 365 oder 366 tage rechnen, obwohl da gar kein jahr dazwischen ist. dann musst du bei den monaten auch noch beim februar das schaltjahr unterscheiden.
    und bei den tagen wieder das gleiche, was passiert, wenn gebT > aktT ist?
    so das ist jetzt das größte was mir auffällt.

    an deiner stelle würde ich mir ein zettel und ein stift nehmen, und alles mal auf einem blatt durch rechnen.



  • Warum benutzt ihr Anfänger die Codetags nicht?
    Was ist so schwierig daran?
    Könnt ihr nicht lesen?

    Lasse die Standardbibliotheksfunktionen für dich arbeiten, zumindest soweit es geht.

    #include <stdio.h>
    #include <time.h> /* <-- hier sind sie drin */
    
    int main()
    {
    	unsigned long tage=0;
    	time_t t;
    	struct tm d1={0},d2={0};
    	d1.tm_year=2004-1900;
    	d2.tm_year=2005-1900;
    	d1.tm_mon=2-1;
    	d2.tm_mon=2-1;
    	d1.tm_mday=28;
    	d2.tm_mday=28;
    
    	t=difftime( mktime(&d2) , mktime(&d1) );
    
    	d1=*gmtime( &t );
    	d1.tm_year+=1900;
    	while( d1.tm_year!=1970 )
    	{
    		if( !d1.tm_year%400 || !(d1.tm_year%4) && (d1.tm_year%100) )
    			tage+=366;
    		else
    			tage+=365;
    		d1.tm_year--;
    	}
    
    	tage+=d1.tm_yday;
    
    	printf("%lu",tage);
    	return 0;
    }
    


  • die haben wir noch nicht in der schule gelernt und dürfen sie deshalb nicht nehmen 😛
    Aber trotzdem danke, auch wenn mein Problem jetzt noch nicht gelöst ist. 🙂

    und wenn das aktj größer als das gebj ist, wird das schon im vornhinein nicht ausgeführt, ist ja nur eine funktion, die ich zum testen in eine main geschrieben habe...

    MFG
    uncannysnake

    P.S.: in wirklichkeit soll ich nämlich den biorythmus berechnen, aber das will ich größtmöglich selber machen...



  • Das julianische Datum dürfte für dich von Interesse sein. Damit ist das dann eine einfache Differenz.

    Dass dieser Biorhythmus-Kram reiner Aberglaube ist, ist dir bekannt, oder?



  • natürlich^^

    ist ja auch nur eine aufgabe...

    erzähl mir doch bitte mehr

    MFG
    uncannysnake



  • Ich habe deinen Ansatz angesehen. Da fallen mir ein paar Böcke auf:
    1. Das Geburtsdatum ist stets fest
    2. Das Zieldatum dagegen ist variabel
    3. Die Schaltjahre interessieren für alle Jahre zwischen Geburtsdatum und Zieldatum, nicht nur für das Geburtsjahr.

    Um zu prüfen, ob Datum1 grösser oder kleiner Datum2 ist, empfiehlt sich eine Datumsumwandlung in long int aus Jahr, Monat, Tag in z.B. 20120405. Die erforderlichen Multiplikatoren setzt du in einer Addition bitte selbst ein.

    Was das jetzt mit Biorythmus zu tun hat, entzieht sich völlig meiner Kenntnis.



  • also noch mal von anfang: 1. das ist eine funktion, das bedeutet alle werte wurden schon überprüftc und natürlich ist das geburtsdatum fest und das aktuelle jahr variabel, es wird ja VORHER übergeben!!!

    2. vielen dank für das mit dem nur für das geburtsjahr werden die schaltjahre überprüft 😃
    denn: das geburtsjahr wird pro durchgang um eins erhöht -.-

    MFG
    uncannysnake



  • Wutz schrieb:

    Warum benutzt ihr Anfänger die Codetags nicht?
    Was ist so schwierig daran?
    Könnt ihr nicht lesen?

    Lasse die Standardbibliotheksfunktionen für dich arbeiten, zumindest soweit es geht.

    #include <stdio.h>
    #include <time.h> /* <-- hier sind sie drin */
    
    int main()
    {
    	unsigned long tage=0;
    	time_t t;
    	struct tm d1={0},d2={0};
    	d1.tm_year=2004-1900;
    	d2.tm_year=2005-1900;
    	d1.tm_mon=2-1;
    	d2.tm_mon=2-1;
    	d1.tm_mday=28;
    	d2.tm_mday=28;
    
    	t=difftime( mktime(&d2) , mktime(&d1) );
    
    	d1=*gmtime( &t );
    	d1.tm_year+=1900;
    	while( d1.tm_year!=1970 )
    	{
    		if( !d1.tm_year%400 || !(d1.tm_year%4) && (d1.tm_year%100) )
    			tage+=366;
    		else
    			tage+=365;
    		d1.tm_year--;
    	}
    
    	tage+=d1.tm_yday;
    
    	printf("%lu",tage);
    	return 0;
    }
    

    Der Code funktioniert leider nicht wenn man das Jahr 1900 eingibt ...
    Warum ist das so ?



  • Hab schon 🙂

    C kann erst ab dem 01.01.1970 zählen



  • nicer_dude_998765 schrieb:

    Hab schon 🙂

    C kann erst ab dem 01.01.1970 zählen

    Da das ein vorzeichenbehafteter Wert ist, kann durchaus frühere Daten angeben:

    Wikipedia schrieb:

    Unixzeiten vor dem 13. Dezember 1901 20:45:52 UTC sind mit einer vorzeichenbehafteten 32-Bit-Zahl auch nicht darstellbar, da die Zeitstempel kleiner als −2.147.483.648 wären.

    Was dann auch zum Jahr-2038-Problem führt.



  • nicer_dude_998765 schrieb:

    Hab schon 🙂

    C kann erst ab dem 01.01.1970 zählen

    google mal nach dem algorithmus für "ewiger kalender".


Log in to reply