Termin Differenz berechnen

aktony

Grünschnabel
Hallo ich will die Differenz zwischen der aktuellen zeit und einem bestimmten Termin berechnen.

Da später die Termine aus einer CSV Datei eingelesen werden sollen ist das Format wichtig und kann nicht verändert werden.

Ich habe nun schon 4 verschiedene Versionen gebaut doch keine will wie ich will.

glaube das ich einfach den Fehler vor ärger nicht mehr sehe "bei so vielen bäumen kann man nin Wald auch schlecht erkennen".


Code:
#include <locale.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <dos.h>
#include <conio.h>
#include <stdlib.h>
 
int main()
{
    time_t systime, termintime;
    struct tm Termin, Stime;
    char msg[1024];
    char bsg[1024];
    char Ttime[14];
    char Termin_jahr[4];
    char Termin_monat[2];
    char Termin_tag[2];
    char Termin_st[2];
    char Termin_min[2];
    char Termin_sek[2];
    int T_J, T_M, T_T, T_H, T_m, T_S;

    strcpy (Ttime, "20070829160000");
    strncpy ( Termin_jahr, &Ttime[0], 4 ) [4]='\4';
    strncpy ( Termin_monat, &Ttime[4], 2 ) [2]='\0';
    strncpy ( Termin_tag, &Ttime[6], 2 ) [2]='\0';
    strncpy ( Termin_st, &Ttime[8], 2 ) [2]='\0';
    strncpy ( Termin_min, &Ttime[10], 2 ) [2]='\0';
    strncpy ( Termin_sek, &Ttime[12], 2 ) [2]='\0';

    /*String zu Integer umwandlung*/
    T_J = atoi (Termin_jahr);
    T_M = atoi (Termin_monat);
    T_T = atoi (Termin_tag);
    T_H = atoi (Termin_st);
    T_m = atoi (Termin_min);
    T_S = atoi (Termin_sek);

    /* Differenz in Tagen von heute bis zum Termin*/
    /* aktuelles Datum in Sekunden */
    time( &systime);
    
    /* Konvertiere Sekunden nach struct tm */
    Stime = *localtime( &systime);

    Termin.tm_year   = T_J; 
    Termin.tm_mon    = T_M;    
    Termin.tm_mday   = T_T;      
    Termin.tm_hour   = T_H;      
    Termin.tm_min    = T_m;     
    Termin.tm_sec    = T_S;      

    /* Konvertiere wieder von struct tm in Sekunden zurück */
    termintime = mktime( &Termin);

    strftime( msg, sizeof(msg), "Heute ist der %Y%m%d%H%M%S\n", localtime(&systime));
    printf( msg);
    printf( "Es sind noch %3.0f bis zum Termin!\n",difftime(systime,termintime) / (24*60*60));

    system("pause");
    return 0;
}

Diese ist momentan die beste und kürzeste Version alle anderen beinhalten noch mehr Code.

Bei der Ausgabe soll am ende angezeigt werden wie viel Monate, Tage, Stunden und Minuten noch verbleiben.

währe echt cool wenn einer mir hier mal auf die Sprünge helfen könnt.
 

aktony

Grünschnabel
Danke für die umfangreiche Hilfe aber das Problem hat sich erledigt.

Habe dabei gleich noch nin Fehler im Builder gefunden, die AtoI Funktion funktioniert nicht richtig ich musste zusätzlich Variabeln definieren die nichts tun außer da stehen und sich langweilen.

Bei der Umwandlung kam immer null obwohl die Daten direkt aus der Zeichenkette kamen.

Durch die variabeln geht es nun ist nur dumm das der Code jetzt auch länger ist als vorher.

Der Builder 6 ist auch sehr empfindlich was die Anordnung der Header Dateien betrifft.

Was in allen Vorgänger Versionen egal war ist hier schnell ein Problem was stunden langes suchen mit sich bringt.

Es war z.b. eigentlich nur MKTIME Funktion die ich hundert Mal eingebunden habe und irgendwie mein Builder nicht kannte und mir nix dir nix auf einmal geht’s ich weis nicht warum aber es funkt.
 

Turri

Erfahrenes Mitglied
Hallo,

Also funktioniert der von dir oben gepostete Code?
Bin nämlich auch an einen funktionierenden Variante interessiert ^^

MfG Turri
 

aktony

Grünschnabel
Code:
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>

int main ()
{
   char Termintime[14];
   char Termin_jahr[4];
   int T_J;
   char Termin_monat[2];
   int T_M;
   char Termin_tag[2];
   int T_T;
   char Termin_st[2];
   int T_H;
   char Termin_min[2];
   int T_m;
   char Termin_sek[2];
   int T_S;

/*Systemzeit einlesen*/
   time_t systime_T;
   time(&systime_T);

/*Termin string + auslesen der einzelnen daten aus der Zeichenkette*/
   strcpy (Termintime, "20070830160000");

   strncpy (Termin_jahr, &Termintime[0], 4) [4]='\4';
   strncpy (Termin_monat, &Termintime[4], 2) [2]='\0';
   strncpy (Termin_tag, &Termintime[6], 2) [2]='\0';
   strncpy (Termin_st, &Termintime[8], 2) [2]='\0';
   strncpy (Termin_min, &Termintime[10], 2) [2]='\0';
   strncpy (Termin_sek, &Termintime[12], 2) [2]='\0';

/*Umwandeln der einzelnen strings zu integer werten*/
   T_J = atoi (Termin_jahr);
   T_M = atoi (Termin_monat);
   T_T = atoi (Termin_tag);
   T_H = atoi (Termin_st);
   T_m = atoi (Termin_min);
   T_S = atoi (Termin_sek);

/*Die Integerwerte in Struct auflösen*/
   struct tm ttime;

   ttime.tm_year   = T_J-1900; /* Year - does not include century */
   ttime.tm_mon    = T_M-1;    /* Month */
   ttime.tm_mday   = T_T;      /* Day of the Month  */
   ttime.tm_hour   = T_H;      /* Hour */
   ttime.tm_min    = T_m;      /* Minutes */
   ttime.tm_sec    = T_S;      /* Seconds */

/*Umwandeln des Structes ttime zu Time_T Wert*/
   time_t tme;
   tme = mktime(&ttime);
   ttime = *localtime(&tme);

/*Time_t Werte Dividieren um rest Zeit zu erhalten*/
  // printf("Es sind noch: %3.0f Tage\n",difftime(tme,systime_T)/(24*60*60));
  // printf("Es sind noch: %3.0f Monate\n",difftime(tme,systime_T)/(365*24*60*60));
   printf("Es sind noch: %3.0f Tage\n",difftime(tme,systime_T)/(24*60*60));
   printf("Es sind noch: %3.0f Stunden\n",difftime(tme,systime_T)/(60*60));
   printf("Es sind noch: %3.0f Minuten\n",difftime(tme,systime_T)/(60));
   printf("Es sind noch: %3.0f Sekunden\n",difftime(tme,systime_T));

  /* ab hier ist es noch nicht fertig*/ 
  struct tm test;
   time_t wert;

   wert = difftime(tme,systime_T);

   wert = mktime(&test);
   test = *localtime(&wert);

   printf ("%02d %02d:%02d:%02d\n",(test));


  system("pause");

return 0;
}

Das ist das bisherige Ergebnis das einzige was nicht so richtig funken will ist das der diff wert von Sekunden in eine volle zeit umgewandelt wird und das nicht von 1970 sonder eben in HH:MM:SS und tage und Monate sollten auch drin vorkommen.

Ich will nur nicht einen ellenlangen Code das muss einfacher gehen.

Also ohne die Sekunden in nin struct auf zu lösen.
 

aktony

Grünschnabel
Können ja hier gemeinsam ne Lösung suchen also ich will die Rest zeit raus bekommen die noch ist bis der Termin abläuft.

Der Termin wiederum soll aus einer CSV-Datei oder SQL-Datenbank ausgelesen werden.

Das auslesen habe ich fertig nur die Differenz will sich nicht in brauchbares Umwandeln lassen.
 

aktony

Grünschnabel
Code:
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>

int main ()
{
   char Termintime[14];
   char Termin_jahr[4];
   int T_J;
   char Termin_monat[2];
   int T_M;
   char Termin_tag[2];
   int T_T;
   char Termin_st[2];
   int T_H;
   char Termin_min[2];
   int T_m;
   char Termin_sek[2];
   int T_S;

/*Systemzeit einlesen*/
   time_t systime_T;
   time(&systime_T);

/*Termin string + auslesen der einzelnen daten aus der Zeichenkette*/
   strcpy (Termintime, "20070831220000");

   strncpy (Termin_jahr, &Termintime[0], 4) [4]='\4';
   strncpy (Termin_monat, &Termintime[4], 2) [2]='\0';
   strncpy (Termin_tag, &Termintime[6], 2) [2]='\0';
   strncpy (Termin_st, &Termintime[8], 2) [2]='\0';
   strncpy (Termin_min, &Termintime[10], 2) [2]='\0';
   strncpy (Termin_sek, &Termintime[12], 2) [2]='\0';

/*Umwandeln der einzelnen strings zu integer werten*/
   T_J = atoi (Termin_jahr);
   T_M = atoi (Termin_monat);
   T_T = atoi (Termin_tag);
   T_H = atoi (Termin_st);
   T_m = atoi (Termin_min);
   T_S = atoi (Termin_sek);

/*Die Integerwerte in Struct auflösen*/
   struct tm ttime;

   ttime.tm_year   = T_J-1900; /* Year - does not include century */
   ttime.tm_mon    = T_M-1;    /* Month */
   ttime.tm_mday   = T_T;      /* Day of the Month  */
   ttime.tm_hour   = T_H;      /* Hour */
   ttime.tm_min    = T_m;      /* Minutes */
   ttime.tm_sec    = T_S;      /* Seconds */

/*Umwandeln des Structes ttime zu Time_T Wert*/
   time_t tme;
   tme = mktime(&ttime);
   //ttime = *localtime(&tme);

/*Time_t Werte Dividieren um rest Zeit zu erhalten*/
   //printf("Es sind noch: %3.0f Tage\n",difftime(tme,systime_T)/(24*60*60));
   printf("Es sind noch: %3.0f Monate\n",difftime(tme,systime_T)/(12*24*60*60));
   printf("Es sind noch: %3.0f Tage\n",difftime(tme,systime_T)/(24*60*60));
   printf("Es sind noch: %3.0f Stunden\n",difftime(tme,systime_T)/(60*60));
   printf("Es sind noch: %3.0f Minuten\n",difftime(tme,systime_T)/(60));
   printf("Es sind noch: %3.0f Sekunden\n",difftime(tme,systime_T));

   time_t wert;

   wert = difftime(tme,systime_T);

   struct tm* rest = localtime (&wert);

   printf ("%04d.%02d.%02d %02d:%02d:%02d\n",
   rest->tm_year -70,
   rest->tm_mon,
   rest->tm_mday-1,
   rest->tm_hour,
   rest->tm_min,
   rest->tm_sec);

  system("pause");

return 0;
}

Ok jetzt passt es fast nur das strcpy (Termintime, "20070831220000"); hier keine Angaben mit dem Jahr 2050 eingegeben werden dürf, auch keine - werte.

Warum

Wer hat das Thema eigentlich beendet soll ich noch ein Thema öffnen

Denke mal nicht oder?
 

Turri

Erfahrenes Mitglied
Ahoi!

Musst das Thema nicht unbedingt nochmal öffnen.
Im großen und ganzen Funktioniert es ja.

Ich bedanke mich fürs Posten deines aktuellen Codes, werd ich bei Gelegenheit mal testen.
Hab mal wieder etwas Zeitknappheit im Moment ;-)

MfG Turri