繁体   English   中英

以毫秒为单位解析字符串到 boost::posix_time::ptime

[英]Parsing string to boost::posix_time::ptime with milliseconds

我有一组函数,允许我根据特定格式将 ptime 转换为字符串并将字符串转换为 ptime。 这很好用,直到我需要使用毫秒修饰符(%f)。

转换为 String 工作正常:

std::string strFormat = "%Y-%m-%d %H:%M:%S.%f";
ptime now = microsec_clock::universal_time();
auto str = ToString(strFormat, now);

将输出:2020-08-26 12:27:54.938943

但相反:

auto pt = FromString(strFormat, str);
std::cout << to_simple_string(pt) << std::endl;

将输出:not-a-date-time

FromString函数使用 time_input_facet :

boost::posix_time::ptime ptime;
boost::posix_time::time_input_facet* infacet = new boost::posix_time::time_input_facet(informat.c_str());

std::stringstream ss;
ss.imbue(std::locale(ss.getloc(), infacet));

ss.str(time);
ss >> ptime;

return ptime;

正如您所看到的, Live On Coliru删除 %f 修饰符工作正常。

我错过了什么? 我尝试了不同的格式但没有成功。 使用 boost 1.70

编辑:正如@sugar 在评论中指定的那样,使用 %F 而不是 %f 似乎可以双向工作。 不应该使用 %f 吗?

事实证明,这是 Boost date_time 库(问题)上的一个错误

为了解决它,我只需将所有出现的 ".%f" 替换为 "%F" :

boost::posix_time::ptime FromString(std::string informat, std::string time)
            {
                boost::replace_all(informat, ".%f", "%F"); // Get around #102
                boost::posix_time::ptime ptime;
                boost::posix_time::time_input_facet* infacet = new boost::posix_time::time_input_facet(informat.c_str());

                std::stringstream ss;
                ss.imbue(std::locale(ss.getloc(), infacet));

                ss.str(time);
                ss >> ptime;
    
                return ptime;
            }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM