class Nuller; class Stream; struct FileTime; struct Date : RelOps< Date, Moveable > { byte day; byte month; int16 year; void Serialize(Stream& s); bool IsValid() const; void Set(int scalar); int Get() const; static Date Low() { return Date(-4000, 1, 1); } static Date High() { return Date(4000, 1, 1); } int Compare(Date b) const; Date& operator++() { if(day < 28) day++; else Set(Get() + 1); return *this; } Date& operator--() { if(day > 1) day--; else Set(Get() - 1); return *this; } Date operator++(int) { Date d = *this; operator++(); return d; } Date operator--(int) { Date d = *this; operator--(); return d; } Date() { year = -32768; day = month = 0; } Date(const Nuller&) { year = -32768; day = month = 0; } Date(int y, int m, int d) { day = d; month = m; year = y; } }; inline hash_t GetHashValue(Date t) { return 512 * t.year + 32 * t.month + t.day; } inline bool operator==(Date a, Date b) { return a.day == b.day && a.month == b.month && a.year == b.year; } template<> inline bool IsNull(const Date& d) { return d.year == -32768; } bool operator<(Date a, Date b); int operator-(Date a, Date b); Date operator+(Date a, int b); Date operator+(int a, Date b); Date operator-(Date a, int b); Date& operator+=(Date& a, int b); Date& operator-=(Date& a, int b); bool IsLeapYear(int year); int GetDaysOfMonth(int month, int year); int DayOfWeek(Date date); Date LastDayOfMonth(Date d); Date FirstDayOfMonth(Date d); Date LastDayOfYear(Date d); Date FirstDayOfYear(Date d); int DayOfYear(Date d); Date AddMonths(Date date, int months); int GetMonths(Date since, Date till); int GetMonthsP(Date since, Date till); Date AddYears(Date date, int years); Date GetWeekDate(int year, int week); int GetWeek(Date d, int& year); Date EasterDay(int year); Date GetSysDate(); String DayName(int i, int lang = 0); String DyName(int i, int lang = 0); String MonthName(int i, int lang = 0); String MonName(int i, int lang = 0); void SetDateFormat(const char *fmt); void SetDateScan(const char *scan); void SetDateFilter(const char *seps); #ifdef PLATFORM_WIN32 // resolve nameclash with win32 API #ifdef GetDateFormatA #undef GetDateFormatA #endif #ifdef GetDateFormatW #undef GetDateFormatW #endif #endif String GetDateFormat(); const char *StrToDate(const char *fmt, Date& d, const char *s, Date def = Null); const char *StrToDate(Date& d, const char *s, Date def); const char *StrToDate(Date& d, const char *s); Date ScanDate(const char *fmt, const char *s, Date def = Null); Date ScanDate(const char *s, Date def = Null); String Format(Date date, const char *fmt); String Format(Date date); int CharFilterDate(int c); template<> inline String AsString(const Date& date) { return Format(date); } struct Time : Date, RelOps< Time, Moveable