首页 > 解决方案 > boost::posix_time::time_facet 和 boost::posix_time::time_input_facet 之间的“%f”行为不一致

问题描述

我正在尝试将 a 转换boost::posix_time::ptime为特定的字符串格式(扩展 ISO),然后再转换回boost::posix_time::ptime.

boost::posix_time::time_facet %f令人惊讶的是,它看起来像是 for 000000999999没有小数分隔符)。但是对于boost::posix_time::time_input_facet,它的意思.000000.999999(带小数点分隔符)。

看:

#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>

int main( int argc, char** argv )
{
    auto now = boost::posix_time::second_clock::local_time();

    std::stringstream outStr;
    {
        boost::posix_time::time_facet* facet = new boost::posix_time::time_facet();
        facet->format("%Y-%m-%dT%H:%M:%S.%f");
        outStr.imbue(std::locale(std::locale::classic(), facet));
        outStr << now;
    }
    std::cout << outStr.str() << std::endl;

    {
        static const std::string format = "%Y-%m-%dT%H:%M:%S.%f";
        const std::locale loc = std::locale(std::locale::classic(), new boost::posix_time::time_input_facet(format));
        std::istringstream is(outStr.str());
        is.imbue(loc);
        boost::posix_time::ptime converted;
        is >> converted;
        std::cout << converted << std::endl;
    }

    {
        static const std::string format = "%Y-%m-%dT%H:%M:%S%f";
        const std::locale loc = std::locale(std::locale::classic(), new boost::posix_time::time_input_facet(format));
        std::istringstream is(outStr.str());
        is.imbue(loc);
        boost::posix_time::ptime converted;
        is >> converted;
        std::cout << converted << std::endl;
    }

    return 0;
}

这输出

2019-04-30T12:23:29.000000
not-a-date-time
2019-Apr-30 12:23:29

虽然我期望:

2019-04-30T12:23:29.000000
2019-Apr-30 12:23:29
not-a-date-time

我正在使用提升 1.68。

我做错了什么还是 or 中的boost::posix_time::time_facet错误boost::posix_time::input_time_facet

注意:'%F' 没有这个问题。

标签: c++boost

解决方案


这绝对是一个提升错误。我在这里填写问题: https ://github.com/boostorg/date_time/issues/102

如果时间没有十进制信息,使用%F效果更好,但行为不同: 试试这个


推荐阅读