boost::p osix_time::time_facet 和 boost::p osix_time::time_input_facet 之间的'%f'行为不一致

Inconsistent '%f' behaviour between boost::posix_time::time_facet and boost::posix_time::time_input_facet

本文关键字:time boost facet osix 不一致 input 之间      更新时间:2023-10-16

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

令人惊讶的是,看起来 boost::posix_time::time_facet %f 意味着 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。

我做错了什么还是boost::posix_time::time_facetboost::posix_time::input_time_facet中的错误?

注意:"%F"没有此问题。

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

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