#include <cstdlib>
#include <stdexcept>
#include <msp/strings/format.h>
+#include <msp/strings/regex.h>
#include "datetime.h"
#include "timestamp.h"
throw out_of_range("DateTime::DateTime mday");
}
+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;
+}
+
void DateTime::add_days(int days)
{
int new_year = year;
void init(int, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned);
public:
+ static DateTime parse_rfc3339(const std::string &);
+
int get_year() const { return year; }
unsigned char get_month() const { return month; }
unsigned char get_mday() const { return mday; }
inline void operator<<(LexicalConverter &c, const DateTime &d)
{ c.result(d.format_rfc3339()); }
+inline void operator>>(const LexicalConverter &c, DateTime &d)
+{ d = DateTime::parse_rfc3339(c.get()); }
+
} // namespace Time
} // namespace Msp