]> git.tdb.fi Git - libs/core.git/blobdiff - source/time/datetime.cpp
Add conversion from RFC3339 string to DateTime
[libs/core.git] / source / time / datetime.cpp
index c77796f7bc0bd8c8cd378d739fb5a458f006a491..26bd7cdb7d59925a0caf076b22dab059e8498a60 100644 (file)
@@ -1,6 +1,7 @@
 #include <cstdlib>
 #include <stdexcept>
 #include <msp/strings/format.h>
+#include <msp/strings/regex.h>
 #include "datetime.h"
 #include "timestamp.h"
 
@@ -104,6 +105,36 @@ void DateTime::init(int y, unsigned char m, unsigned char d, unsigned char h, un
                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;