C++ Irgendein Fehler bei Datum und Uhrzeit, hilfe! :O



  • Hallo Leute,
    ich mache gerade ein paar Übungen da ich C++ für mein Studium lernen möchte, und jetzt geht es um ein Programm welches einem die Uhrzeit und das Datum ausgibt.

    Ich habe im Internet jetzt gefunden das wenn man include<time.h> benutzt das für
    time_t time(time_t *t); dem wert t die anzahl der sekunden zugewiesen wird die seit dem 1.1.1970 vergangen sind.. GMT.
    Also hab ich versucht es jeweils durch die sekunden zahl zu dividieren und dann mit % auf den aktuellen monat,tag,stunde etc. zu kommen.
    Soweit so gut, es leuchtet nichts rot auf, aber wenn ich es starte dann sagt er mir wir hätten den November 2032 usw.

    Meine frage ist, wo ich denn da jetzt einen Fehler gemacht hab. Würde mich über schnelle Hilfe freuen!

    Mit freundlichen Grüßen, Michi

    Hier mein code

    #include<iostream>
    #include<string>
    #include<time.h>
    using namespace std;
    int main()
    {
        int t;
    time_t time(time_t *t);
    string z;
    int jahr,monat,tag,stunde,minute;
    jahr= 1970+t/31536000;
    monat=(t/2628000)%12;
    tag=(t/86400)%30;
    
    stunde=(t/3600)%24;
    minute=(t/60)%60;
    cout<<"Bitte geben sie ihren vollstaendigen Namen ein:\n\n";
    getline(cin,z);
    cout<<"Guten Tag "<<z<<".\nHeute ist der "<<tag<<'.'<<monat<<'.'<<jahr<<", und ";
    cout<<stunde<<':'<<minute<<" Uhr.";
    
     return 0;
    }
    

    Das hier ist mein output:

    Bitte geben sie ihren vollstaendigen Namen ein:
    
    Ulrich Binichnich
    Guten Tag Ulrich Binichnich.
    Heute ist der 11.11.2032, und 12:9 Uhr.
    Process returned 0 (0x0)   execution time : 16.436 s
    Press any key to continue.
    


  • Das musst du nicht zu Fuß umrechen, dafür bietet die time.h bzw bei C++ besser ctime eine Funktionalität mit.



  • Hallo,

    mit

    time_t time(time_t *t);
    

    hast du nur die Deklaration der Funktion wiederholt (die auch im <time.h> header angegeben ist).
    Du mußt schon diese Funktion korrekt aufrufen:

    time_t t; // statt "int t"
    
    time(&t); // der Rückgabewert kann ignoriert werden
    // oder alternativ so aufrufen
    t = time(0);
    

    Daß du bisher die Ausgabe "11.11.2032" erhalten hast, liegt einfach daran, daß in t ein zufällig initialisierter Wert steht.



  • Oh mein Gott! Jetzt sieht es schon sehr viel besser aus^^. Vielen Dank auf jeden Fall schon mal.
    Mein Code sieht jetzt so aus:

    #include<iostream>
    #include<string>
    #include<time.h>
    using namespace std;
    int main()
    {
    
    //time_t time(time_t *t);
    time_t t;
    time(&t);
    string z;
    int jahr,monat,tag,stunde,minute;
    jahr= 1970+t/31536000;
    monat=(t/2628000)%12;
    tag=(t/86400)%30;
    
    stunde=(t/3600)%24;
    minute=(t/60)%60;
    cout<<"Bitte geben sie ihren vollstaendigen Namen ein:\n\n";
    getline(cin,z);
    cout<<"Guten Tag "<<z<<".\nHeute ist der "<<tag<<'.'<<monat<<'.'<<jahr<<", und ";
    cout<<stunde<<':'<<minute<<" Uhr.";
    
     return 0;
    }
    

    Und die Ausgabe :

    Bitte geben sie ihren vollstaendigen Namen ein:
    
    Ulrich Binichnich
    Guten Tag Ulrich Binichnich.
    Heute ist der 6.9.2013, und 18:31 Uhr.
    Process returned 0 (0x0)   execution time : 5.045 s
    Press any key to continue.
    

    Aber wie ihr seht stimmt ist die Zeit um 2 stunden verschoben, und mein monat + tag geben mir noch nicht das was ich da gerne stehen hätte.
    Da muss der Fehler ja jetzt an den rechnungen liegen ((t/......
    oder?

    MfG Ulrich



  • Ps. was bedeutet eigentlich der Teil mit dem time(&t) ?
    Erhöhe ich damit mein t um 1 für jeden schritt von time?



  • Schaltjahre vergessen? Die Rechnung ist recht aufwändig und würde ich nur zu Übungszwecken selber implementieren.



  • Ja danke TNA, je mehr ich mich an Schaltjahre annähere, desto genauer wird das Ergebniss.

    Also vielen dank an alle nochmal für die schnelle und gute Hilfe 🙂

    MfG Ulrich



  • Du solltest auch bedenken, dass bei der Zeit die Daten bei 0 anfangen, während beim Datum die Angaben bei 1 anfangen. 01.01.1970 00:00:00

    Ulrich Binichnich schrieb:

    Ps. was bedeutet eigentlich der Teil mit dem time(&t) ?
    Erhöhe ich damit mein t um 1 für jeden schritt von time?

    Du übergibst der Funktion time die Adresse von der Variablen t.
    Über die Adresse kann time den Inhalt von t ändern.

    & ist in diesem Fall der Adressoperator.



  • Ulrich Binichnich schrieb:

    Aber wie ihr seht stimmt ist die Zeit um 2 stunden verschoben

    Sommerzeit?



  • Gibt der Timestamp nicht die Londoner Zeit an? Die ist doch momentan 2 Stunden hinter unserer, oder?



  • Hallo nochmal,

    wie TNA schon geschrieben hat, schau dir mal die anderen Funktionen im <ctime>-Header an, um die (aktuelle lokale) Zeit auszugeben.


Anmelden zum Antworten