Jason Dolan wrote:
I'm looking to take a string and convert it to a date. The only problem is the string can be one of many patterns. i.e. ("%Y%m%d", "%Y-%m-%d", "%d/%m/%Y", etc...). It is also possible that the given string will fail all pattern matches, and thus return false.
And there's nothing to indicate which pattern it might be? Nope. I'm basically allowing the user to input a date and time *almost* anyway they want. What I want to do is test that string against my list of patterns(i.e. known ways to write a date and time) to try and parse
Jeff Garland wrote: the date. What I'm doing right now is: bool SetDate(string &strDate) { m_vecFormats[0] = "%Y%m%d"; m_vecFormats[1] = "%Y-%m-%d"; m_vecFormats[2] = "%d/%m/%Y"; m_vecFormats[3] = "%d/%m/%Y %H:M%"; ... ... ... for(int iter=0; iter < m_vecFormats.size() && bValidDate == false; iter++) { cerr << "Trying format: " << m_vecFormats[iter]; if(SetDate(strDate, m_vecFormats[iter])) { cerr << "\tWORKED!!" << endl; bValidDate = true; } else cerr << "\tFAILED!!" << endl; } } bool SetDate(string &strDate, string &strFormat) { bool bValidDate = false; time_input_facet *f = new time_input_facet(); f->format(strFormat.c_str()); ptime d(not_a_date_time); stringstream ss; ss.imbue(locale(ss.getloc(), f)); ss << strDate; ss >> d; if(!d.is_not_a_date_time()) { bValidDate = true; } return bValidDate; } But I'm not sure if this is the right way to go about it. Further, what happens if they just put in a time (it would make sense to assume it is the current date), Can this handle a two digit year? I wouldn't think so... Besides that, each time the second SetDate function is called (which will be once for each format for the worst case), I have to create a time_input_facet object, a stringstream object and a pdate object. It would be nice to have a function like this use less resources since it's called so much.