Good question -- this is the kind of thing I've been struggling with lately (I tried to post a question about it to the group, but I worded it poorly and the moderator rejected it). Anyway, here's the solution I came up with. I am sure there are better ones! - Dean //! Utility function to split apart string. Returns # of components. inline int split_into_two_or_less(const std::string& s, char sep, std::string& first, std::string& second) { int sep_pos = static_cast<int>(s.find(sep)); if (sep_pos == -1) { first = s; return 1; } else { first = s.substr(0,sep_pos); second = s.substr(sep_pos+1); return 2; } } class expected_character : public boost::bad_lexical_cast { char _messagebuf[81]; public: expected_character(const char* who, char ch, const char* str, int pos) { snprintf(_messagebuf, sizeof(_messagebuf), "%s: Expected '%c' at position %d in \"%s\"", who, ch, pos, str); _messagebuf[sizeof(_messagebuf)-1] = '\0'; } const char* what() const throw() { return _messagebuf; } }; //! Parse date string of form YYYY-MM-DD // Code adapted from boost/date_time/date_parsing.hpp's parse_undelimited_date() template <class date_type> inline date_type parse_delimited_iso_8601_date(const std::string& s) { int offsets[] = {4,1,2,1,2}; int pos = 0; typedef typename date_type::year_type year_type; typename date_type::ymd_type ymd((year_type::min)(),1,1); // TODO: Is there a boost macro for sizeof(a)/sizeof(type)? or for the end of an array? boost::offset_separator osf(offsets, offsets+sizeof(offsets)/sizeof(offsets[0])); boost::tokenizerboost::offset_separator tok(s, osf); for(boost::tokenizerboost::offset_separator::iterator ti=tok.begin(); ti!=tok.end();++ti) { switch(pos) { case 0: ymd.year = boost::lexical_cast<unsigned short>(*ti); break; case 1: if (*ti != "-") { throw expected_character("parse_delimited_iso_8601_date", '-', s.c_str(), 5); } break; case 2: ymd.month = boost::lexical_cast<unsigned short>(*ti); break; case 3: if (*ti != "-") { throw expected_character("parse_delimited_iso_8601_date", '-', s.c_str(), 7); } break; case 4: ymd.day = boost::lexical_cast<unsigned short>(*ti); break; } pos++; } return date_type(ymd); }