Rechnen mit dem Datum



  • Hallöle, ich versuche meinem Sohn etwas zu helfen. Er benutzt in der Schule Borland C++ V 5.02 zum lernen usw. Ich bin auch etwas fit aber nur mit MS ASP.NET mehr Visual Basic.
    Jetzt meine Frage:
    Ich möchte einfach das aktuelle Datum abfragen und in ein Array schreiben als string, das habe ich erfolgreich absolviert.
    Sicherlich zur Belustigung des Forums

    time_t aktdatum= time(0);
       struct tm *ptm= localtime(&aktdatum);
       sprintf(Datum,"%02i.%02i.%04i",
                       (int)ptm->tm_mday,
                       (int)ptm->tm_mon+1,
                       (int)ptm->tm_year+1900);
    

    Jetzt soll aber das aktuelle Datum erhöht werden um x Tage und hier liegt der Hase im Pfeffer, ich werde noch halb blöde im Kopf weil ich das nicht hinbekomme 😕 ?
    Hat jemand eine idee was ich machen kann? Ideal wäre es als Funktion.
    Sinn dieser Aktion ist ein mehrdimensionales Array x,0 ist das datum und x,1 -x,8 sind freie Kapazitäten zu diesen Tag.

    Ich bin für alles dankbar bis später



  • Grundsätzlich löst du das so:

    [cpp]#include <time.h>
    #include <stdio.h>

    int main(void)
    {
    char datum[11];
    struct tm *ptm;
    time_t aktdatum;

    aktdatum = time (NULL);
    aktdatum += 9 / Tage /
    * 24 /
    Stunden/Tag /
    * 60 /
    Minuten/Stunde /
    * 60; /
    Sekunden/Minute /

    ptm = localtime (&aktdatum);
    sprintf(datum,"%02i.%02i.%04i",
    (int) ptm->tm_mday,
    (int) ptm->tm_mon + 1,
    (int) ptm->tm_year + 1900);
    return (0);
    }[/cpp]

    Moritz



  • hallo Moritz,

    danke aber leider nicht das richtig 😞 .
    Ich habe folgende Idee:

    aktuelles Datum ermitteln ->aktDatum

    neuDatum = aktDatum + Tage

    Es soll folgendes realisiert werden:
    Baue ein Array beginnend von heute und 300 Tage in die Zukunft. und fülle den rest.

    Schönen Abend noch



  • MSBenny schrieb:

    danke aber leider nicht das richtig 😞 .
    Ich habe folgende Idee:

    aktuelles Datum ermitteln ->aktDatum

    neuDatum = aktDatum + Tage

    Es soll folgendes realisiert werden:
    Baue ein Array beginnend von heute und 300 Tage in die Zukunft. und fülle den rest.

    Dafür kannst du die Methode durchaus anwenden. Z.B. so:

    typedef struct _tag_date
    {
            unsigned char    Day;
            unsigned char    Month;
            unsigned short   Year;
    } date_t;
    
    date_t days[300];
    
    void filldays (void)
    {
            struct  tm *ptm;
            time_t  date_cur;
            time_t  date_add = 24 * 60 * 60; /* ein Tag */
            date_t* cur;
            date_t* last;
    
            date_cur = time (NULL);
    
            for (cur = days, last = days + 300; cur < last; ++cur)
            {
                    ptm = localtime (&date_cur);
                    date_cur += date_add;
                    cur->Day = (unsigned char) ptm->tm_mday;
                    cur->Month = (unsigned char) ptm->tm_mon + 1;
                    cur->Year = (unsigned short) ptm->tm_year + 1900;
            }
    }
    

    Moritz



  • Hallo Moritz,

    danke für die Info, es klappt einwandfrei, habe es etwas umgestrickt und jetzt läuft die ganze Sache!
    Da habe ich schon wieder das nächste Problem, also C++ empfinde ich etwas 👎 , warum also wenn schon Sachen die in der Hilfe hinterlegt sind nicht klappen, was soll das.
    Also Der Anwender gibt das datum ein Tag, Monat, Jahr. ich will das prüfen ob es richtig ist, mit der Funktion mktime.
    Das schlimmste ist nur, ich bekomme nie einen Fehler weil diese beschiss.. Funktion gnadenlos alles umwandelt.
    Beispiel Tag = 33 Monat = 5 Jahr = 2005 lt. Help sollte mktime -1 zurückgeben, gibt sie aber nicht, weil es wird umgewandelt zu 02.06.2005.

    #include <iostream.h>
    #include <fstream.h>
    #include <stdlib.h>
    #include <time.h>
    #include <stdio.h>
    
    int main(void)
    {
          time_t t1;
    		int tag,monat,jahr;
          tag = 33;
          monat = 5;
          jahr = 2005;
    
          int aa,bb,cc;
    
          struct tm Datumtest;
          /*  load the time_check structure with the data */
    	   Datumtest.tm_year = jahr - 1900;
        	Datumtest.tm_mon  = monat - 1;
    	   Datumtest.tm_mday = tag;
       	Datumtest.tm_hour = 0;
    	   Datumtest.tm_min  = 0;
       	Datumtest.tm_sec  = 1;
    	   Datumtest.tm_isdst = -1;
          t1 = mktime(&Datumtest);
          aa = (Datumtest.tm_year-1900);
          cout<<Datumtest.tm_mday<<"."<<(Datumtest.tm_mon+1)<<"."<<(Datumtest.tm_year+1900)<<endl;
    		cout<<mktime(&Datumtest)<<endl;
         return 0;
    }
    

    Ausgabe
    2.6.2005
    1117663201
    Ziel der Übung ist prüfen der Eingabe 1. Datum richtig und 2. Datum > heute

    //Test ist Datum groesser Heute
    int DatumDiff(int vtag,int vmonat,int vjahr)
    {
    		time_t Datumakt1=time (NULL);
          struct tm Difftime;
          double diff;
    	   Difftime.tm_year = vjahr - 1900;
        	Difftime.tm_mon  = vmonat - 1;
    	   Difftime.tm_mday = vtag;
       	Difftime.tm_hour = 0;
    	   Difftime.tm_min  = 0;
       	Difftime.tm_sec  = 1;
    	   Difftime.tm_isdst = -1;
          diff =    difftime(mktime(&Difftime),Datumakt1);
    return diff;
    }
    

    Bin für jede Idee dankbar.

    Ganz ehrlich, ich denke manchmal C++ Version 5.02 und MS Windows XP SP 2 laufen nicht was man da so erlebt 😮
    Also freue mich über jede Antwort.



  • MSBenny schrieb:

    Da habe ich schon wieder das nächste Problem, also C++ empfinde ich etwas 👎 , warum also wenn schon Sachen die in der Hilfe hinterlegt sind nicht klappen, was soll das.

    Redest du von C++ oder von einem Compiler?

    MSBenny schrieb:

    Also Der Anwender gibt das datum ein Tag, Monat, Jahr. ich will das prüfen ob es richtig ist, mit der Funktion mktime.
    Das schlimmste ist nur, ich bekomme nie einen Fehler weil diese beschiss.. Funktion gnadenlos alles umwandelt.
    Beispiel Tag = 33 Monat = 5 Jahr = 2005 lt. Help sollte mktime -1 zurückgeben, gibt sie aber nicht, weil es wird umgewandelt zu 02.06.2005.

    Für diesen Zweck hat Volkard hier eine ganz nützliche Funktion gepostet, wenn auch in einem anderen Kontext.

    MSBenny schrieb:

    #include <iostream.h>
    #include <fstream.h>
    #include <stdlib.h>
    #include <time.h>
    #include <stdio.h>
    

    Das entspricht nicht dem aktuellen C++-Standard; verwende
    statt
    iostream.h
    fstream.h
    stdlib.h
    time.h
    stdio.h

    besser
    iostream
    fstream
    cstdlib
    ctime
    cstdio

    und schreibe dann

    using namespace std;
    

    hinter die #include-Direktiven.

    MSBenny schrieb:

    Ganz ehrlich, ich denke manchmal C++ Version 5.02 und MS Windows XP SP 2 laufen nicht was man da so erlebt 😮

    C++ Version 5.02? Du meinst, Version 5.02 deines C++-Compilers? Wenn du mit diesem Probleme hast, solltest du ihn eventuell einmal auf den neuesten Stand bringen; einfach mal rechts oben im Forum auf "Compiler" klicken.

    Moritz


Anmelden zum Antworten