Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 706
Neel Avatar asked Dec 03 '25 23:12

Neel


2 Answers

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
like image 88
sehe Avatar answered Dec 05 '25 12:12

sehe


You can use a time_facet. Here's an example that prints UTC date/time:

std::string PrintDateTime()
{
    std::stringstream str;
    boost::posix_time::time_facet *facet = new boost::posix_time::time_facet("%d.%m.%Y-%H:%M:%S-UTC");
    str.imbue(std::locale(str.getloc(), facet));
    str << boost::posix_time::second_clock::universal_time(); //your time point goes here
    return str.str();
}

Notice that you don't need to worry about the memory management of facet. It's taken care of already from within boost.

like image 22
The Quantum Physicist Avatar answered Dec 05 '25 14:12

The Quantum Physicist



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!