Я пытался использовать библиотеку C ++ Boost date_time для загрузки строки формата «16:43 12 декабря 2012 г.» в поток строк с фасетом ввода даты «% H:% M% B% d,% Y».
Далее я хочу создать объект Boost ptime из строкового потока, чтобы я мог выполнять математику даты / времени.
Я не могу заставить его работать — ниже код:
std::string autoMatchTimeStr(row["message_time"]);
ptime autoMatchTime(time_from_string(autoMatchTimeStr));
date_input_facet* fin = new date_input_facet("%H:%M %B %d, %Y");
stringstream dtss;
dtss.imbue(std::locale(std::locale::classic(), fin));
dtss << msg.getDate(); //msg.getDate() returns “16:43 December 12, 2012”
ptime autoMatchReplyTime;
dtss >> autoMatchReplyTime;
if( autoMatchReplyTime < autoMatchTime + minutes(15)) {
stats[ "RespTimeLow" ] = "increment";
sysLog << "RespTimeLow" << flush;
}
AutoMatchTime содержит допустимое значение даты / времени, а autoMatchReplyTime — нет. Я хотел бы узнать, как это должно работать, но если мне нужно использовать C strptime для инициализации struct tm для конструктора ptime, я могу это сделать. Я потратил много времени на исследования, кодирование, отладку с помощью GDB и не могу понять это. Любая помощь будет принята с благодарностью.
Итак … Почему вы пытаетесь использовать date_input_facet
вместо time_input_facet
? Следующий пример работает нормально.
#include <sstream>
#include <boost/date_time/posix_time/posix_time.hpp>
int main()
{
const std::string time = "16:43 December 12, 2012";
boost::posix_time::time_input_facet* facet =
new boost::posix_time::time_input_facet("%H:%M %B %d, %Y");
std::stringstream ss;
ss.imbue(std::locale(std::locale(), facet));
ss << time;
boost::posix_time::ptime pt;
ss >> pt;
std::cout << pt << std::endl;
}
Других решений пока нет …