c – boost :: posix_time :: time_input_facet可以处理非标准的
发布时间:2020-12-16 07:13:25 所属栏目:百科 来源:网络整理
导读:我试图从文本文件中解析日期时间.时间戳具有微秒精度,但由于我无法控制的历史原因,它们是使用冒号而不是点来创建的,以分隔小数秒部分,例如: 2015/05/05 03:10:43:537408 代替 2015/05/05 03:10:43.537408 我能够使用此代码解析这些时间戳而不保留小数秒: #
我试图从文本文件中解析日期时间.时间戳具有微秒精度,但由于我无法控制的历史原因,它们是使用冒号而不是点来创建的,以分隔小数秒部分,例如:
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; 正如您可能猜到的那样,使用小写-f小数秒格式化器会导致解析失败(pt仍然不是一个日期时间).此外,在格式字符串中插入冒号也无济于事: const std::string inputFormat = "%Y/%m/%d %H:%M:%S:%F"; Boost似乎推断出点分隔符. 除了显式检查冒号分隔符并以不同方式处理它之外,是否有人知道是否可以使用boost库解析这种非标准时间格式? 解决方法
没有内置的方式.
time_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,t,c); } break; } case 'F': { // check for decimal,skip if missing if(*sitr == '.') { ++sitr; parse_frac_type(sitr,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; } 您可以修改实现(参见例如Format a posix time with just 3 digits in fractional seconds)或子类并覆盖相关的成员函数. 不管因为这个类不是为继承而设计的,它会有点烦人. 我个人认为格式字符串只表示没有任何分隔符的小数设置,因此您确实可以包含:格式规范内部. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |