Denkanstoss zu Tageszahl --> Datum



  • Hallo,
    ich suche einen Web, wie ich aus der aktuellen Tageszahl, z.B. heute ist Tag 174 im Jahr, das Datum berechnen kann.

    Ich habe angefangen erstmal nach Schaltjahr zu unterscheiden und dann mit else-if's auszusortieren.

    Also z.B.:

    if tag<=31
    Monat=1
    else if tag >=32 && tag <=60
    Monat=2
    etc.

    aber das ist recht aufwendig und erscheint mir blödsinnig, zumal ich soch zwar auf den Monat komme aber nicht auf den Tag im Monat?!

    Hat jemand ne idee?
    Danke 🙂


  • Mod

    Lass dir Standardbibliothek die Arbeit machen:

    #include<time.h>
    #include<stdio.h>
    
    int main()
    {
      int year = 2010;
      int day_of_the_year=194;
      char date_string[80];
      struct tm date;
    
      date.tm_year=year-1900;
      date.tm_mon=0;
      date.tm_mday=day_of_the_year;
      date.tm_isdst=-1;
      date.tm_hour=0;
      date.tm_min=0;
      date.tm_sec=0;
    
      mktime(&date);
    
      strftime(date_string,80, "%d.%m.%Y",&date);
    
      printf ( "Der %i. Tag des Jahres %i ist der %s\n", day_of_the_year, year, date_string );
    
      return 0;
    }
    

    Erklärung: struct tm kennt zwar ein Feld für den Tag des Jahres, aber dieser wird praktisch von allen Funktionen in der time.h ignoriert. Der Trick ist nun, dass man einfach den Monat auf 0 setzt (d.h. Januar) und den Tag des Monats auf den Tag des Jahres. Sprich: Heute ist der 194. Januar 2010. Das macht zwar nicht viel Sinn, aber freundlicherweise rechnet die Funktion mktime alles richtig um. Das heißt danach kann man sich mit den Funktionen aus der time.h das richtige datum ausgeben lassen. Hier mit strftime, man konnte natürlich auch einfach direkt die richtigen Werte aus dem nun korrekt date nehmen.

    edit: Man könnte natürlich noch abfangen ob die Umwandlung durch mktime erfolgreich war. Dazu ist der Rückgabewert ja da. Ich weiß zwar kein Szenario wo die Umwandlung scheitern würde, aber sicher ist sicher.



  • Wie wär's damit:

    void getDate( int dayOfYear, int year, int *monthPtr, int *dayOfMonth )
    {
       int month;
       static int daysOfMonth[] = { 31, 28, 31 .... };  // den rest macht Ihr selber
    
       if( year%4 )  // bin jetzt zu faul, alle Bedingungen zu schreiben f. 1901-2099 passt das aber.
          daysOfMonth[1] = 28;
       else
          daysOfMonth[1] = 29;
    
       for( month=0; month<12 && dayOfYear>daysOfMonth[month]; month++ )
          dayOfYear -= daysOfMonth[month];
    
       *monthPtr = month+1;
       *dayOfMonth = dayOfYear;
    }
    

    Diese Version ist aber nicht Threadsafe.

    mfg Martin



  • yo super, beide Lösungen sehen auf jeden Fall besser aus als mein Denkansatz!

    Ich werde es mal ausarbeiten und den fertigen Code für die Nachwelt einstellen.

    Viel Dank an Euch beide! 👍

    Edit: fertig!

    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    
    int main(void)
    {
         int dayofyear, year, month, monthptr, *dayofmonth;
         static int daysofmonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 
    
         printf("Bitte geben Sie das Jahr ein:\n");
         scanf ("%d", &year);
         printf("\nBitte geben Sie nun den Tag ein:\n");
         scanf ("%d", &dayofyear);   
    
         if ((year % 400) == 0)
         daysofmonth[1] = 29;
         else if ((year % 100) == 0)
         daysofmonth[1] = 28;
         else if ((year % 4) == 0)
         daysofmonth[1] = 29;
         else
         daysofmonth[1] = 28;
    
         for( month=0; month<12 && dayofyear>daysofmonth[month]; month++ ) 
          dayofyear = dayofyear-daysofmonth[month]; 
    
         monthptr = month+1; 
         *dayofmonth = dayofyear; 
    
         printf("\nDas Datum lautet: %d.%d.%d",*dayofmonth,monthptr,year);
    
         getch();
    }
    

Anmelden zum Antworten