From 441344d49cc3c31e8e42e712f809734600accc51 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 22 Aug 1994 11:15:31 +0000 Subject: [PATCH] Aggiunta la possibilita' di trattare le date in formato ANSI (YYYYMMDD). git-svn-id: svn://10.65.10.50/trunk@45 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- include/date.cpp | 578 +++++++++++++++++++++++++---------------------- 1 file changed, 302 insertions(+), 276 deletions(-) diff --git a/include/date.cpp b/include/date.cpp index b805f0f01..bd62ce4bc 100755 --- a/include/date.cpp +++ b/include/date.cpp @@ -1,276 +1,302 @@ -#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]; -} +#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; +HIDDEN char __date_tmp_string[20]; + +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 + if (strchr(s, '-') == NULL) + { + strcpy(__date_tmp_string, s); + + int day = atoi(__date_tmp_string + 6); __date_tmp_string[6] = '\0'; + int month = atoi(__date_tmp_string + 4); __date_tmp_string[4] = '\0'; + int year = atoi(__date_tmp_string); + 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) +{ + char s[256]; + + in >> s; + if (isdate(s)) _val = cpackdata(s); + else _val = NULLDATE; +} + + +char* TDate::string(int yeardgts, char sep) const + +{ + if (!ok()) return ""; + long wv = _val; + int cnt = wv >= DAYBIAS ? 2000 : 1900; + + while (wv < 0) + { + cnt -= 100; + wv += DAYBIAS; + } + ceditdata(wv, __date_tmp_string); + if (strcmp(__date_tmp_string, " - - ") == 0) return ""; + if (sep != '-') + for (char* s = __date_tmp_string; *s; s++) + if (*s == '-') *s = sep; + if (yeardgts > 2) + { + char s[8]; + int year = cnt + atoi(__date_tmp_string + 6); + + if (yeardgts == 3) sprintf(s, "%03d", year % 1000); + else sprintf(s, "%04d", year); + __date_tmp_string[6] = '\0'; + strcat(__date_tmp_string, s); + } + else + if (yeardgts == ANSI) + { + char* s = __date_tmp_string; s[2] = '\0'; s[5] = '\0'; + const int day = atoi(s); + const int month = atoi(s + 3); + const int year = atoi(s + 6); + + sprintf(__date_tmp_string, "%04d%02d%02d", year, month, day); + } + return __date_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]; +}