使用自定义格式序列化boost ptime

时间:2014-07-05 10:22:49

标签: c++ boost time format posix

我必须将boost::posix_time::ptime变量序列化为字符串。我想要的格式是:2014-05-12T16:14:01.809+0200。我无法更改它,因为它是从Web服务请求的,我必须遵守所请求的格式。 我可以暗示时区是本地时区。 我看到了一些例子,但我没有找到任何让我从UTC ptime获得std::string的东西。

添加了我想要的一些细节: 我从boost::posix_time::ptime开始。我想以我之前指定的格式打印它,但我不知道我的实际时区是什么。我必须通过库函数调用找到它。 那么我要做的就是用这个原型编写一个函数:std::string time_to_custom_string(boost::posix_time::ptime datetime);

1 个答案:

答案 0 :(得分:0)

如果你不介意一些尾随000的小数秒:

#include <boost/date_time/local_time/local_time.hpp>
#include <locale>

static boost::local_time::time_zone_ptr const s_timezone(new boost::local_time::posix_time_zone("+02:00"));

std::string mydateformat(boost::local_time::local_date_time const& ldt)
{
    using namespace boost;
    std::ostringstream 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("%Y-%m-%dT%H:%M:%s%q");

    ss.str("");
    ss << ldt;
    return ss.str();
}

std::string mydateformat()
{
    using namespace boost;

    posix_time::ptime my_ptime = posix_time::second_clock::universal_time();
    local_time::local_date_time ldt(my_ptime, s_timezone);

    return mydateformat(ldt);
}

int main()
{
    using namespace boost;

    gregorian::date d(2014, 5, 12);
    posix_time::time_duration td(16, 14, 1, 809000);
    local_time::local_date_time ldt(d, td, s_timezone, false/*daylight savings*/);

    std::cout << mydateformat(ldt) << "\n";
    assert("2014-05-12T16:14:01.809000+0200" == mydateformat(ldt));
}