Sekunden in HH:MM:SS umwandeln?



  • Hi,

    wie kann ich z.B. Sekunden (94519451) in ein HH:MM:SS format umwandeln und ausgeben?



  • Wenn ich richtig verstehe, was du meinst,

    int time_in_seconds = 23456;
    int seconds = time_in_seconds % 60;
    int minutes = time_in_seconds / 60 % 60;
    int hours = time_in_seconds / 3600;
    char str[10];
    
    sprintf(str, "%d:%d:%d", hours, minutes, seconds);
    

    Danach steht in str, wie viele Stunden, Minuten und Sekunden die angegebene Zahl Sekunden ist.



  • musst halt nur noch gucken, ob die sekunden oder minuten kleiner als 10 sind und dann noch ne 0 einfügen



  • @0xdeadbeef
    division und dann %? Gefährlich... Also keine sehr schöne lösung. Was ist wenn nach der Division eine Dezimalzahl kommt? Dann hast du den salat.



  • Kann doch gar nicht -> Integerdivision



  • Trotzdem, keine sehr schöne Lösung. Kein C++, keine 0 wenn die Zahl unter 10 ist usw.



  • int time_in_seconds = 23456;
    	int seconds = time_in_seconds % 60;
    	int minutes = time_in_seconds / 60 % 60;
    	int hours = time_in_seconds / 3600;
    
    	std::stringstream buf(std::ios::in | std::ios::out | std::ios::trunc);
    	buf << std::setiosflags(std::ios::right) << std::setfill('0')
                << std::setw(2)
    	    << hours << std::setw(1) << ":"
    	    << std::setw(2)
      	    << minutes << std::setw(1) << ":"
    	    << std::setw(2)
    	    << seconds;
    	std::cout << buf.str();
    	std::cin.get();
    

    Jetzt nicht getestet, aber das ist doch eine schönere Lösung 🕶
    //EDIT:
    Jetz getestet.



  • Worauf ich mich noch einlasse, ist

    sprintf(str, "%2d:%2d:%2d", hours, minutes, seconds);
    

    ...aber das wars dann auch. Naja - oder halt mit stringstream, das ist in der Tat schöner. Ansonsten sehe ich nicht, was an einer Division und Modulo schlecht sein soll. Das letzte mal, als ich gekuckt habe, konnte C++ durchaus einfache Rechenoperationen durchführen, und für x < 10 ist x / 60 % 60 halt 0 - wo ist das Problem?



  • YASC schrieb:

    int time_in_seconds = 23456;
    	int seconds = time_in_seconds % 60;
    	int minutes = time_in_seconds / 60 % 60;
    	int hours = time_in_seconds / 3600;
    
    	std::stringstream buf(std::ios::in | std::ios::out | std::ios::trunc);
    	buf << std::setiosflags(std::ios::right) << std::setfill('0')
                << std::setw(2)
    	    << hours << std::setw(1) << ":"
    	    << std::setw(2)
      	    << minutes << std::setw(1) << ":"
    	    << std::setw(2)
    	    << seconds;
    	std::cout << buf.str();
    	std::cin.get();
    

    Jetzt nicht getestet, aber das ist doch eine schönere Lösung 🕶
    //EDIT:
    Jetz getestet.

    könnte man in einen char[9] selber die zeichen schreiben?



  • 0xdeadbeef schrieb:

    und für x < 10 ist x / 60 % 60 halt 0 - wo ist das Problem?

    Ich wollte damit nur verhindern, dass sowas passiert:

    10:5:21
    

    Aber genau das bewirkt ja dein %2d



  • @volkard
    mach du doch mal ne elegante lösung 🙂 ich mein, du bist doch schließlich: Der Pate!


Anmelden zum Antworten