+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)