#include #include #include #define __DATE_CPP #include #include #include #include #define DAYBIAS 36525L #define NULLDATE -99999L TDate nodate, botime, eotime(31,12,2050); HIDDEN TDate __tmp_date; TDate::TDate(const TDate &d) : _val(d._val) {} TDate::TDate(long l) : _val(l) { if (_val == TODAY) { char s[10]; cgetdata(&_val, s); } } TDate::TDate(const char* s) { _val = NULLDATE; if (!isdate(s)) return; if (strlen(s) == 10) { int day = atoi(s), month = atoi(&s[3]), year = atoi(&s[6]); long off = 0L; if (year > 1000) { if (year < 1951) off -= DAYBIAS; if (year < 1851) off -= DAYBIAS; if (year < 1751) off -= DAYBIAS; year %= 100; // modify } _val = makedata(day, month, year) + off; } else _val = cpackdata((char*)s); } TDate::TDate(int day, int month, int year) { if (day == TODAY) { char s[10]; cgetdata(&_val, s); } else if ((day == 0) || (month == 0) || (year == 0)) _val = NULLDATE; else { long off = 0L; if (year > 1000) { if (year < 1951) off -= DAYBIAS; if (year < 1851) off -= DAYBIAS; if (year < 1751) off -= DAYBIAS; year %= 100; // modify } _val = makedata(day, month, year) + off; if (!ok()) _val = NULLDATE; } } TDate::operator const char*() const { return string(4); } TDate& TDate::operator =(const char* s) { return *this = TDate(s); } void TDate::print_on(ostream& out) const { out << string(); } void TDate::read_from(istream& in) { in >> __tmp_string; if (isdate(__tmp_string)) _val = cpackdata(__tmp_string); else _val = NULLDATE; } char* TDate::string(int yeardgts, char sep) const { if (!ok()) return ""; long wv = _val; // int cnt = int(wv / DAYBIAS - (wv < 0 ? 1 : 0)); int cnt = wv >= DAYBIAS ? 2000 : 1900; // int cnt = 0; // bool over2000 = wv >= DAYBIAS; while (wv < 0) { cnt -= 100; wv += DAYBIAS; } ceditdata(wv, __tmp_string); if (strcmp(__tmp_string, " - - ") == 0) return ""; if (sep != '-') for (char* s = __tmp_string; *s; s++) if (*s == '-') *s = sep; if (yeardgts > 2) { char s[8]; // int year = ::year(wv) - cnt * 100; // if (year > 2000 && !over2000) year -= 100; // int year = 1900 + cnt * 100 + atoi(__tmp_string + 6); int year = cnt + atoi(__tmp_string + 6); if (yeardgts == 3) sprintf(s, "%03d", year % 1000); else sprintf(s, "%04d", year); __tmp_string[6] = '\0'; strcat(__tmp_string, s); } return __tmp_string; } int TDate::day() const { return ::day(_val); } int TDate::month() const { return ::month(_val); } int TDate::year() const { return ::year(_val); } void TDate::addmonth(int nmonth) { _val = ::addmonth(_val, nmonth); } void TDate::addyear(int nyear) { _val = ::addyear(_val, nyear); } bool TDate::isdate(const char* s) { if (!*s) return FALSE; if (strlen(s) == 10) { int day = atoi(s), month = atoi(&s[3]), year = atoi(&s[6]); if (day < 1 || day > 31 || month < 1 || month > 12 || year < 1700 || year > 2100) return FALSE; char s1[16]; sprintf(s1, "%02d-%02d-%02d", day, month, year%100); return (bool)cverdata(s1); } return (bool)cverdata((char*)s); } bool TDate::ok() const { return _val <= 2 * DAYBIAS && _val >= -2 * DAYBIAS; } TDate& operator +(const TDate& a, long nday) { __tmp_date = long(a) + nday; return __tmp_date; } TDate& operator +(const long nday, const TDate& b) { __tmp_date = long(b) + nday; return __tmp_date; } TDate& operator -(const TDate& a, long nday) { __tmp_date = long(a)- nday; return __tmp_date; } void swap(TDate& a, TDate& b) { __tmp_date = b; b = a; a = __tmp_date; } const TDate& fnc_min(const TDate& a, const TDate& b) { if (a < b) return a; else return b; } const TDate& fnc_max(const TDate& a, const TDate& b) { if (a > b) return a; else return b; } // Converte un numero da 1 a 12 nel corrispondente mese const char* itom(byte m) { const char* nomi[12] = { "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre" }; return nomi[(m-1) % 12]; } const char* itow(byte d) { const char* nomi[7] = { "Lunedi", "Martedi", "Mercoledi", "Giovedi", "Venerdi", "Sabato", "Domenica" }; return nomi[(d-1) % 7]; }