Search code examples
c++boostboost-date-time

Epoch time to date/time format in boost c++


In Linux, i am reading epoch time from "/proc/stat" as btime and i want to convert to readable date and time format with c++ boost.

I have tried below things and date is working properly.

    time_t btime_ = 1505790902; //This is epoch time read from "/proc/stat" file.

    std::wstring currentDate_ = L"";
    boost::gregorian::date current_date_ = 
             boost::posix_time::from_time_t(btime_).date();

    std::wstring year_ = boost::lexical_cast<std::wstring>
                                         (current_date_.year());
    std::wstring day_ = boost::lexical_cast<std::wstring>
                                         (current_date_.day());

Here i am getting correct year and day. BUT How can i get time( HH::MM:SS) from above epoch time ? Let me give hint - i can try.

Thanks in Advance.


Solution

  • Just:

    Live On Coliru

    #include <ctime>
    #include <boost/date_time/posix_time/posix_time_io.hpp>
    
    int main() {
        std::time_t btime_ = 1505790902; //This is epoch time read from "/proc/stat" file.
    
        std::cout << boost::posix_time::from_time_t(btime_) << "\n";
    
        std::cout.imbue(std::locale(std::cout.getloc(), new boost::posix_time::time_facet("%H:%M:%S")));
        std::cout << boost::posix_time::from_time_t(btime_) << "\n";
    }
    

    Prints

    2017-Sep-19 03:15:02
    03:15:02
    

    UPDATE

    To the comment:

    Live On Coliru

    #include <boost/date_time/posix_time/posix_time_io.hpp>
    #include <boost/date_time/c_local_time_adjustor.hpp>
    
    namespace pt = boost::posix_time;
    namespace g  = boost::gregorian;
    using local_adj = boost::date_time::c_local_adjustor<pt::ptime>;
    
    int main() {
        std::cout.imbue(std::locale(std::cout.getloc(), new pt::time_facet("%H:%M:%S")));
    
        std::time_t btime_ = 1505790902; // This is epoch time read from "/proc/stat" file.
    
        pt::ptime const timestamp = pt::from_time_t(btime_);
    
        std::cout << timestamp << "\n";
    
        // This local adjustor depends on the machine TZ settings
        std::cout << local_adj::utc_to_local(timestamp) << " local time\n";
    }
    

    Prints

    + TZ=CEST
    + ./a.out
    03:15:02
    03:15:02 local time
    + TZ=MST
    + ./a.out
    03:15:02
    20:15:02 local time