+DateTime DateTime::parse_rfc3339(const string &str)
+{
+ static Regex re("^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(Z|[-+]([0-9]{2}):([0-9]{2}))$");
+
+ RegMatch m = re.match(str);
+ if(!m)
+ throw invalid_argument("DateTime::parse_rfc3339");
+
+ unsigned year = lexical_cast<unsigned>(m[1].str);
+ unsigned month = lexical_cast<unsigned>(m[2].str);
+ unsigned mday = lexical_cast<unsigned>(m[3].str);
+ unsigned hr = lexical_cast<unsigned>(m[4].str);
+ unsigned minute = lexical_cast<unsigned>(m[5].str);
+ unsigned second = lexical_cast<unsigned>(m[6].str);
+
+ DateTime result = DateTime(year, month, mday, hr, minute, second);
+
+ int tzoff = 0;
+ if(m[7].str!="Z")
+ {
+ tzoff = lexical_cast<unsigned>(m[8].str)*60+lexical_cast<unsigned>(m[9].str);
+ if(m[7].str[0]=='-')
+ tzoff = -tzoff;
+ }
+
+ result.set_timezone(tzoff);
+
+ return result;
+}
+