I need to get a nicely formatted timestamp (slightly modified ISO 8601) with millisecond precision.
And example date would look like this: 2011-09-28 13:11:15.237-08:00
The formatting should be able to be overwridden as well.
I've been playing around with boost::posix_time::microsec_clock::local_time()
and boost::posix_time::time_facet
which works just fine except when it comes to timestamps.
Since posix time doesn't contain time zone information this is just not possible (I'm guessing)
So, is there anything else I could use that has millisecond precision that contains timezone information or can I make the time_facet
work with timezones?
Maybe I should always use UTC?
Thanks
Have a look at the boost::local_time::local_date_time class. You can specify a time zone and use the local microsecond clock to initialize it like
boost::local_time::local_date_time my_ldt(boost::local_time::local_microsec_clock::local_time(new boost::local_time::posix_time_zone("EST-5EDT,M4.1.0,M10.5.0")));
You should then be able to use the facets to format to a string.
Edit: Full example:
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <boost/date_time/local_time/local_time.hpp>
int main(void)
{
boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
boost::posix_time::ptime utc = boost::posix_time::second_clock::universal_time();
boost::posix_time::time_duration tz_offset = (now - utc);
std::stringstream ss;
boost::local_time::local_time_facet* output_facet = new boost::local_time::local_time_facet();
ss.imbue(std::locale(std::locale::classic(), output_facet));
output_facet->format("%H:%M:%S");
ss.str("");
ss << tz_offset;
boost::local_time::time_zone_ptr zone(new boost::local_time::posix_time_zone(ss.str().c_str()));
boost::local_time::local_date_time ldt = boost::local_time::local_microsec_clock::local_time(zone);
boost::local_time::local_time_facet* output_facet = new boost::local_time::local_time_facet();
ss.imbue(std::locale(std::locale::classic(), output_facet));
output_facet->format("%Y-%m-%d %H:%M:%S%f%Q");
ss.str("");
ss << ldt;
std::cout << ss.str() << std::endl; // "2004-02-29 12:34:56.000789-05:00"
std::cout << "Press return to exit" << std::endl;
std::string wait_for_line;
std::getline(std::cin, wait_for_line);
return (0);
}