C++ boost::posix_time::time_input_facet能否处理非标准分数秒分隔符?

C++ boost::posix_time::time_input_facet能否处理非标准分数秒分隔符?,c++,boost,C++,Boost,我正在尝试从文本文件解析日期时间。时间戳的精度为微秒,但由于我无法控制的历史原因,它们是使用冒号而不是点来分隔分数秒部分的,例如: 2015/05/05 03:10:43:537408 而不是 2015/05/05 03:10:43.537408 我能够使用以下代码解析这些时间戳,而不保留小数秒: #include <iostream> #include <sstream> #include <boost/date_time.hpp> namespace

我正在尝试从文本文件解析日期时间。时间戳的精度为微秒,但由于我无法控制的历史原因,它们是使用冒号而不是点来分隔分数秒部分的,例如:

2015/05/05 03:10:43:537408
而不是

2015/05/05 03:10:43.537408
我能够使用以下代码解析这些时间戳,而不保留小数秒:

#include <iostream>
#include <sstream>
#include <boost/date_time.hpp>
namespace bt = boost::posix_time;

const std::string inputString = "2015/05/05 03:10:43:537408";
const std::string inputFormat = "%Y/%m/%d %H:%M:%S%F";

bt::time_input_facet * facet = new bt::time_input_facet(inputFormat);
const std::locale loc(std::locale::classic(), facet);

std::istringstream iss(inputString);
iss.imbue(loc);
boost::posix_time::ptime pt;
iss >> pt;
Boost似乎推断出了点分隔符


除了明确检查冒号分隔符并以不同方式处理它之外,有人知道是否可以使用boost库解析这种非标准时间格式吗?

没有内置的方法

time_facet get函数假定
为分隔符:

    case 'f':
      {
        // check for decimal, check SV if missing
        if(*sitr == '.') {
          ++sitr;
          parse_frac_type(sitr, stream_end, frac);
          // sitr will point to next expected char after this parsing
          // is complete so no need to advance it
          use_current_char = true;
        }
        else {
          return check_special_value(sitr, stream_end, t, c);
        }
        break;
      }
    case 'F':
      {
        // check for decimal, skip if missing
        if(*sitr == '.') {
          ++sitr;
          parse_frac_type(sitr, stream_end, frac);
          // sitr will point to next expected char after this parsing
          // is complete so no need to advance it
          use_current_char = true;
        }
        else {
          // nothing was parsed so we don't want to advance sitr
          use_current_char = true;
        }
        break;
      }
您可以修改实现(例如,请参见)或子类,并重写相关的成员函数

不管怎样,这都会有点烦人,因为这个类不是为继承而设计的

我个人认为格式字符串只表示分数设置,没有任何分隔符,因此您确实可以在格式规范中包含

如果您从“boost/data\u time/time\u facet.hpp”标题重新实现“time\u input\u facet”类并注释以下行,您可以解决问题:

case 'f':
{
    // check for decimal, check SV if missing
    //if (*sitr == '.') {
        //++sitr;
        parse_frac_type(sitr, stream_end, frac);
        // sitr will point to next expected char after this parsing
        // is complete so no need to advance it
        use_current_char = true;
    //}
    //else {
    //    return check_special_value(sitr, stream_end, t, c);
    //}
    break;
}
case 'F':
{
    // check for decimal, skip if missing
    //if (*sitr == '.') {
        //++sitr;
        parse_frac_type(sitr, stream_end, frac);
        // sitr will point to next expected char after this parsing
        // is complete so no need to advance it
        use_current_char = true;
    //}
    //else {
    //    // nothing was parsed so we don't want to advance sitr
    //    use_current_char = true;
    //}
    break;
}
case 'f':
{
    // check for decimal, check SV if missing
    //if (*sitr == '.') {
        //++sitr;
        parse_frac_type(sitr, stream_end, frac);
        // sitr will point to next expected char after this parsing
        // is complete so no need to advance it
        use_current_char = true;
    //}
    //else {
    //    return check_special_value(sitr, stream_end, t, c);
    //}
    break;
}
case 'F':
{
    // check for decimal, skip if missing
    //if (*sitr == '.') {
        //++sitr;
        parse_frac_type(sitr, stream_end, frac);
        // sitr will point to next expected char after this parsing
        // is complete so no need to advance it
        use_current_char = true;
    //}
    //else {
    //    // nothing was parsed so we don't want to advance sitr
    //    use_current_char = true;
    //}
    break;
}