我想您可以尝试使用这些格式将字符串转换为ptime,并选择那些不会导致not_a_date_time的字符串:
boost format flags与你的略有不同,我将为这个例子做最后五个:
#include
#include
using boost::posix_time::time_input_facet;
using std::locale;
const locale inputs[] = {
locale(locale::classic(), new time_input_facet("%m/%d/%Y")),
locale(locale::classic(), new time_input_facet("%Y-%m-%d %H:%M:%S")),
locale(locale::classic(), new time_input_facet("%Y%m%d%H%M%S")),
locale(locale::classic(), new time_input_facet("%Y%m%d%H%M")),
locale(locale::classic(), new time_input_facet("%Y%m%d")) };
const size_t formats = sizeof(inputs)/sizeof(inputs[0]);
time_t ptime_to_time_t(boost::posix_time::ptime t)
{
static boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
return (t-epoch).ticks() / boost::posix_time::time_duration::ticks_per_second();
}
int main()
{
std::string msg = "2010-08-04 08:34:12";
for(size_t i=0; i
{
std::istringstream ss(msg);
ss.imbue(inputs[i]);
boost::posix_time::ptime this_time;
ss >> this_time;
if(this_time != boost::posix_time::not_a_date_time)
std::cout << this_time << " or " << ptime_to_time_t(this_time) << std::endl;
}
}