
-----Original Message----- From: Christian Henning [mailto:chhenning@gmail.com] Sent: Tuesday, March 21, 2006 4:23 PM To: boost-users@lists.boost.org Subject: Re: [Boost-users] [date_time] How to create a date from string withspecific format?
Hi Dean, thanks for the answer.
Since, I know the format of the date strings I could also use boost::regex for the general format and then feeding a date object with the values. If I get an exception during the date object contruction I know that the user provided me with garbage.
Any thoughts on that?
Thanks again, Christian
Have you considered using Regex's submatches? A slightly modified example follows. // date format: mm-dd-yyyy boost::regex oDateReg( "(\\d{2})-(\\d{2})-(\\d{4})" ); std::string strDate( "11-33-1997" ); boost::smatch dateMatch; if( boost::regex_match( strDate , dateMatch , oDateReg )) { try { std::string strMonth = dateMatch[1]; std::string strDay = dateMatch[2]; std::string strYear = dateMatch[3]; unsigned int nYear = boost::lexical_cast<unsigned int>(strYear); unsigned int nMonth = boost::lexical_cast<unsigned int>(strMonth); unsigned int nDay = boost::lexical_cast<unsigned int>(strDay); date d( nYear, nMonth, nDay ); date::ymd_type ymd = d.year_month_day(); } catch( std::out_of_range oEx ) { std::cout << "Error: " << oEx.what() << std::endl; } } There are two advantages to this. First, you no longer need to count characters when extracting the date components. Second, you have a little more freedom in defining your date format. For example, you could use the following definition for oDateReg to also accept single-digit months and/or days: boost::regex oDateReg( "(\\d{1,2})-(\\d{1,2})-(\\d{4})" ); Andrew Holden