3

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.

The Quantum Physicist
  • 24,987
  • 19
  • 103
  • 189
Neel
  • 451
  • 1
  • 9
  • 23

2 Answers2

3

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
sehe
  • 374,641
  • 47
  • 450
  • 633
  • Thanks. it is useful. Now I have one question. here we get the time (03:15:02) in UTC. Can we get this time depending on system timezone ? – Neel Sep 22 '17 at 05:10
  • @Neel That's unrelated. I just nicked the sample from [the docs](http://www.boost.org/doc/libs/1_55_0/doc/html/date_time/examples.html#date_time.examples.local_utc_conversion) and updated my answer. See it [Live On Coliru](http://coliru.stacked-crooked.com/a/99be80d809161d2f) – sehe Sep 22 '17 at 10:06
1

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.

The Quantum Physicist
  • 24,987
  • 19
  • 103
  • 189