Boost - 使用时间戳记格式化次精度时间 [英] Boost - Formatting sub second precision time with a time stamp
问题描述
我需要以毫秒的精度获得格式正确的时间戳(略微修改ISO 8601)。
I need to get a nicely formatted timestamp (slightly modified ISO 8601) with millisecond precision.
示例日期如下所示: 2011-09-28 13:11:15.237-08:00
格式化也应该能够覆盖。
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.
我一直在玩 boost :: posix_time :: microsec_clock :: local_time()
和 boost :: posix_time :: time_facet
,除非它
由于posix时间不包含时区信息,这是不可能的(我猜猜)
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)
因此,还有其他任何我可以使用的毫秒精度包含时区信息,或者我可以使 time_facet
与时区一起工作吗?
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?
也许我应该总是使用UTC?
Maybe I should always use UTC?
谢谢
推荐答案
看看boost :: local_time :: local_date_time类。您可以指定时区,并使用本地微秒时钟来初始化它
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")));
您应该能够使用facet格式化为字符串。
You should then be able to use the facets to format to a string.
编辑:完整示例:
#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);
}
这篇关于Boost - 使用时间戳记格式化次精度时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!