+string DateTime::format_rfc3339() const
+{
+ string result = format("%Y-%m-%dT%H:%M:%S");
+ if(const TimeDelta &offs = zone.get_offset())
+ {
+ ostringstream ss;
+ ss.fill('0');
+ int m = abs(static_cast<int>(offs/Time::min));
+ ss<<(offs<zero ? '+' : '-')<<setw(2)<<m/60<<':'<<setw(2)<<m%60;
+ result += ss.str();
+ }
+ else
+ result += 'Z';
+ return result;
+}
+
+void DateTime::init(const TimeStamp &ts)
+{
+ year = 1970;
+ month = 1;
+ mday = 1;
+ hour = 0;
+ minute = 0;
+ second = 0;
+ usec = 0;
+ add_raw(ts.raw());
+}
+
+void DateTime::init(int y, unsigned char m, unsigned char d, unsigned char h, unsigned char n, unsigned char s, unsigned u)
+{
+ year = y;
+ month = m;
+ mday = d;
+ hour = h;
+ minute = n;
+ second = s;
+ usec = u;
+ validate();
+}
+
+void DateTime::add_raw(RawTime raw)