
Hi! With the code below I try to automagically determine the date format found in input files. I'd expect the code below to find the date format "%d.%m.%Y" for "05.02.2008", but I got surprised by obtaining "%m/%d/%Y". A major pain it is with those dates. Whether my shallow knowledge of locales and imbue or boost::date_time (from boost-1.37.0) is to be blamed is beyond my horizon. I feel like date accepts '.' where I said "expect '/'", so I think this should be changed. I may be wrong. Could you please shed some light on the issue? Thanks, Markus #include <boost/assign/list_of.hpp> #include <boost/date_time/posix_time/posix_time.hpp> #include <boost/date_time/gregorian/gregorian.hpp> #include <boost/date_time/local_time/local_time.hpp> #include <boost/foreach.hpp> #include <boost/algorithm/string.hpp> #include <string> #include <list> inline std::string determine_date_format(std::string const & s) { using namespace boost::assign; using namespace boost::gregorian; std::list<std::string> possible_formats = // TODO: add others here! list_of ("%Y-%m-%d")("%Y/%m/%d")("%m/%d/%Y")("%d.%m.%Y"); bool inform_user = false; BOOST_FOREACH(std::string const & format, possible_formats) { if (inform_user) { std::cout << "Trying format '" << format << "' ..." << std::endl; } try { date_input_facet * input_facet = new date_input_facet(format.c_str()); std::istringstream iss(s); iss.imbue(std::locale(iss.getloc(), input_facet)); date d(not_a_date_time); iss >> d; if (!iss.fail() && (!d.is_not_a_date())) { return format; } std::cout << "WARNING: date format '" << format << "' does not match '" << s << "'." << std::endl; inform_user = true; } catch(...) { } } std::cout << "WARNING: date format not recognized. " << "Please reconfigure your measurement equipment " << "to ISO standard output!" << std::endl; return ""; } int main() { std::string the_date = "05.02.2008"; std::string format = determine_date_format(the_date); std::cout << the_date << " has date-time-format " << format << std::endl; return 0; }