Sekunden ins Format "hh:mm:ss"



  • Wie kann ich Sekunden in das Format "hh🇲🇲ss" bringen?

    int sek = 29301;
    string sekform = ???;



  • Was ist dein Ansatz?
    Ich meine Du kannst ja Rechnen, hoffe ich...


  • Mod

    Nun, wie viele Sekunden hat denn eine Minute so? Und wieviele Sekunden hat eine Stunde?

    Und dann gibt es noch so schöne Mathematikoperationen, namens Division (Ganzzahldivision, in C durch / repräsentiert) und modulo (Rest einer Ganzzahldivision, in C durch % repräsentiert). Wenn du noch syntaktischen Zucker oben drauf haben willst gibt es auch noch eine Funktion namens div in der cstdlib, die beides gleichzeitig macht.



  • ganz so trivial ist es ja nicht, wenn man z.B. nicht weiß was ein ostringstream oder setfill und setw ist:

    #include <sstream>
    #include <string>
    #include <iostream>
    #include <iomanip>
    
    struct hh_mm_ss
    {
        explicit hh_mm_ss( int sekunden ) : m_sekunden( sekunden ) {}
        friend std::ostream& operator<<( std::ostream& out, hh_mm_ss z )
        {
            using std::setw;
            const char fillc = out.fill('0');
            out << setw(2) << z.m_sekunden/3600 << ":" << setw(2) << (z.m_sekunden % 3600)/60 << ":" << setw(2) << z.m_sekunden % 60;
            out.fill( fillc );
            return out;
        }
    private:
        int m_sekunden;
    };
    
    int main()
    {
        using namespace std;
        int sek = 29301;
        cout << hh_mm_ss( sek ) << endl;
    
        // bzw.
        ostringstream buf;
        buf << hh_mm_ss( sek );
        string sekform = buf.str();
    
        // oder:     sekform = boost::lexical_cast< string >( hh_mm_ss( sek ) );
        return 0;
    }
    

    Ausgabe

    08:08:21
    


  • Werner_logoff schrieb:

    ganz so trivial ist es ja nicht, wenn man z.B. nicht weiß was ein ostringstream oder setfill und setw ist

    Weiß jetzt nicht so recht, was das damit zu tun hat:

    char zeit[] = "00:00:00";
    int sekunden = 8566;
    int x;
    
    x = sekunden % 60;
    zeit[6] = x / 10 + '0';
    zeit[7] = x % 10 + '0';
    
    x = (sekunden / 60) % 60;
    zeit[3] = x / 10 + '0';
    zeit[4] = x % 10 + '0';
    
    x = (sekunden / 3600);
    zeit[0] = x / 10 + '0';
    zeit[1] = x % 10 + '0';
    

    Ungetestet und nicht sehr performant, aber man braucht nichtmal C++-Kenntnisse dazu. Obwohl dass damit durchaus schöner geht...

    Ich glaub, es gibt ne Time-Klasse, die sowas alles drin hat.



  • Ich dachte mir, dass es schon eine Time-Klasse gibt
    und ich wollte dann diese benutzen.
    Gibt es dazu ein Beispiel?



  • die gibts höchstens in boost. und glaub mir du willst dich nicht an den brocken boost binden nur für so eine minifunktionalität.


  • Mod

    In der ctime stehen jede Menge Funktionen dafür. Da solltest du alles finden was du brauchst.



  • strftime (timestamp, 10,"%H:%M:%S", 29301);

    Gruß Frank



  • Danke Frank!

    Kannst Du mir bitte ein kleines Komplett-Beispiel geben?

    Ich habe einen AnsiString mit den Sekunden "123".
    Ich muss diese Sekunden nach char[] "00:00:00" wandeln.





  • csofti schrieb:

    Ich habe einen AnsiString

    Borland / Codegear / Embarcadero IDE?
    Dann versuchs doch mal mit dem VCL-Unterforum. Gibt nämlich schicke Funktionen in der DateUtils.hpp 😉

    mfg
    xXx



  • naja csofti,

    Ich habe einen AnsiString mit den Sekunden "123".

    Dann musst du den string "123" noch in einen int wandeln:

    'atoi' macht das dann für dich:
    http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

    Ein Beispiel gebe ich dir nicht,
    das käme programmieren gleich,
    und das sollst du bitteschön selbst machen ...

    Gruß Frank


Anmelden zum Antworten