--- /dev/null
+/* $Id$ */
+#ifndef MSP_TIME_DATETIME_H_
+#define MSP_TIME_DATETIME_H_
+
+#include <stdint.h>
+#include <string>
+
+namespace Msp {
+namespace Time {
+
+class TimeDelta;
+class TimeStamp;
+
+/**
+Provides handling of arbitary dates and times. Can represent a moment of time
+in the range of about ±2.1×10⁹ years. It can also be formatted into a string
+for presentation to the user.
+
+Due to the complex internal representation, arithmetic operations on a DateTime
+are relatively slow. For purposes of internal scheduling in a program, a
+TimeStamp is a better choice.
+*/
+class DateTime
+{
+public:
+ DateTime(const TimeStamp &);
+ DateTime(int32_t, uint8_t, uint8_t);
+ DateTime(int32_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t);
+ DateTime(int32_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint32_t);
+
+ int32_t get_year() const { return year; }
+ uint8_t get_month() const { return month; }
+ uint8_t get_mday() const { return mday; }
+ uint8_t get_hour() const { return hour; }
+ uint8_t get_minute() const { return minute; }
+ uint8_t get_second() const { return second; }
+ uint32_t get_usec() const { return usec; }
+
+ void add_days(int32_t);
+
+ DateTime operator+(const TimeDelta &) const;
+ DateTime &operator+=(const TimeDelta &);
+
+ bool operator==(const DateTime &d) const { return cmp(d)==0; }
+ bool operator!=(const DateTime &d) const { return cmp(d)!=0; }
+ bool operator<(const DateTime &d) const { return cmp(d)<0; }
+ bool operator<=(const DateTime &d) const { return cmp(d)<=0; }
+ bool operator>(const DateTime &d) const { return cmp(d)>0; }
+ bool operator>=(const DateTime &d) const { return cmp(d)>=0; }
+
+ int cmp(const DateTime &) const;
+ TimeStamp get_timestamp() const;
+ std::string format(const std::string &) const;
+private:
+ int32_t year;
+ uint8_t month;
+ uint8_t mday;
+ uint8_t hour;
+ uint8_t minute;
+ uint8_t second;
+ uint32_t usec;
+
+ void add_raw(int64_t);
+ void normalize();
+};
+
+} // namespace Time
+} // namespace Msp
+
+#endif