boost posix_time



  • Hallo Gemeinde,

    ich möchte mit Boost Date Time die aktuelle Systemzeit auslesen, und in dieses Format umwandeln: HH:MM:SS jedoch bekomme ich das nicht hin.

    #include "boost/date_time/gregorian/gregorian.hpp"  
    #include "boost/date_time/posix_time/posix_time.hpp"  
    #include <iostream>
    int main()
    {
    	using namespace boost::posix_time;
        ptime now = microsec_clock::local_time();
    	time_duration tod = now.time_of_day();
    
    	std::cout << tod.hours() << ':' << tod.minutes() << ':' << tod.seconds() << std::endl;
    
    	return 0;
    }
    

    Jedoch bekomme ich da zum Beispiel 1:2:0 raus, in einem Log-File sieht das doof aus, wenn die werte < 10 sind nur einstellig sind. Eine wünschenswerte Ausgabe wäre demnach 01:02:00. Die konvertationen "to_simple_string" etc. Sind auch nicht geeignet da dort die Fractional seconds angehängt werden.

    Kann mir jemand sagen wie ich das Ausgabeformat anpassen kann?

    Danke für die Hilfe.

    so long
    jd



  • schau mal nach den manipulatoren setw und setfill.
    http://www.cplusplus.com/reference/iostream/manipulators/


  • Administrator

    Gibt auch noch I/O Möglichkeiten von Boost.DateTime:
    http://www.boost.org/doc/libs/1_39_0/doc/html/date_time/date_time_io.html

    Grüssli



  • Hi,

    danke schonmal für eure Hilfe, ich habe mich jetzt fast den ganzen Tag mit boost date_time befasst und bin zu keinem entschluss gekommen, konnte mein Problem nicht lösen, ich vermute mal das date_time für solche lapalen sachen ungeeignet ist. Oder hat da jemand noch einen Lösungsvorschlag?

    ich das jetzt so gelöst:

    #include <ctime>
    #include <fstream>
    #include <iostream>
    using namespace std;
    
    int main() {
        time_t now = time(0);
        char timestamp[22];
        strftime(timestamp, 22, "%H:%M:%S", localtime(&now));
    
    	std::cout << timestamp << std::endl;
    
        return 0;
    }
    

    Damit funktioniert das was ich will mit nur ein paar zeilen Code, entweder geht das nicht mit boost, was ich will oder es wäre zu Overkill.

    so long
    jd


  • Administrator

    @jd,
    Das einfachste wäre, wenn du statt microsec_clock die second_clock verwenden würdest:

    #include <boost/date_time/posix_time/posix_time.hpp>
    
    #include <iostream>
    
    int main()
    {
        using namespace boost::posix_time;
    
        ptime now = second_clock::local_time();
        time_duration tod = now.time_of_day();
    
        std::cout << tod << std::endl;
    
        return 0;
    }
    

    Falls du bei deinen Mikrosekunden bleiben möchtest, sie aber nicht ausgeben möchtest, dann musst du sie vor der Ausgabe entfernen. Zum Beispiel auf diese Weise:

    #include <boost/date_time/posix_time/posix_time.hpp>
    
    #include <iostream>
    
    int main()
    {
        using namespace boost::posix_time;
    
        ptime now = microsec_clock::local_time();
        time_duration tod = now.time_of_day();
    
        tod -= microseconds(tod.fractional_seconds());
        std::cout << tod << std::endl;
    
        return 0;
    }
    

    Aber du kannst es natürlich auch auf deine Art und Weise machen, wenn du dabei unbedingt auf Boost.DateTime verzichten und auf C Lösungen setzen willst.

    Grüssli



  • @Dravere

    Danke für die Hilfe, das funktioniert, nun kann die C-Variante wieder verwerfen, die war nur dafür da damit es überhaupt funktioniert.


Log in to reply