#ifndef __DATE_H #define __DATE_H #ifndef __OBJECT_H #include #endif #define NULLDATE 0L #define TODAY -1L // @doc EXTERNAL // @enum TDate_order | Criterio col quale ordinare gli elementi della data enum TDate_order { gma_date = 1, // @emem Giorno-Mese-Anno (default 1) mga_date, // @emem Mese-Giorno-Anno amg_date, // @emem Anno-Mese-Giorno a_date, // @emem Solo anno m_date, // @emem Solo Mese g_date, // @emem Solo Giorno ma_date }; // @emem Mese-Anno // @enum TDate_mgafmt | Criterio col quale visualizzare le date enum TDate_mgafmt { ANSI = -1, // @emem Formato ANSI brief = 2, // @emem Formato breve full = 4, // @emem Formato completo letters = 5, // @emem Lettere weekday = 6, // @emem Giorno della settimana quarter = 7, // @emem Formato trimestrale def = 99 }; // @emem Formato standard // @class TDate | Classe per la gestione delle date // // @base public | TObject class TDate : public TObject { // @cmember Valore data in formato packed long _val; protected: // @cmember Controlla se una data e' minore di un'altra friend bool operator <(const TDate& a, const TDate& b); // @cmember Controlla se una data e' maggiore di un'altra friend bool operator >(const TDate& a, const TDate& b); // @cmember Controlla se una data e' minore o ugaule ad un'altra friend bool operator <=(const TDate& a, const TDate& b); // @cmember Controlla se una data e' maggiore o uguale ad un'altra friend bool operator >=(const TDate& a, const TDate& b); // @cmember Controlla se 2 date sono uguali friend bool operator ==(const TDate& a, const TDate& b); // @cmember Controlla se una 2 date sono diverse friend bool operator !=(const TDate& a, const TDate& b); long makedata(int day, int month, int year) const { return (10000L * year) + ( 100L * month) + day; } // @access Public Member public: // @cmember Ritorna la data in formato di stringa (anche in formato ANSI) char* string(TDate_mgafmt year = full, char sep = '-', TDate_mgafmt day = full, TDate_mgafmt month = full, TDate_order ord = gma_date) const ; long date2julian() const; long julian2date(long julian) const; // @cmember Ritorna il giorno int day() const ; // @cmember Ritorna il mese int month() const ; // @cmember Ritorna l'anno int year() const ; // @cmember Ritorna il giorno della settimana (0 = domenica) int wday() const ; // @cmember Aggiunge dei mesi void addmonth(int nmonth = 1); // @cmember Aggiunge degli anni void addyear(int nyear = 1); // @cmember Controlla se si tratta di una data corretta bool ok() const; // @cmember Controlla se la stringa passata e' una data corretta static bool isdate(const char*); // @cmember Ritorna l'ultimo giorno possibile del mese static int last_day(int month, int year); // @cmember Controlla se il giorno e' l'ultimo del mese bool is_end_month(); // @cmember Setta il giorno del mese all'ultimo possibile void set_end_month(); // @cmember Setta la il giorno void set_day(int n); // @cmember Setta il mese void set_month(int n); // @cmember Setta l'anno void set_year(int n); // @cmember Permette di stabilire il criterio di formattazione delle date void set_format(const char* f); // @cmember Incrementa la data di un certo numero di giorni TDate& operator +=(const long nday) { _val = julian2date(date2julian() + nday); return *this; } // @cmember Decrementa la data di un certo numero di giorni TDate& operator -=(const long nday) { _val = julian2date(date2julian() - nday); return *this; } // @cmember Incrementa la data di un giorno TDate& operator ++() { _val = julian2date(date2julian() + 1); return *this; } // @cmember Decrementa la data di un giorno TDate& operator --() { _val = julian2date(date2julian() - 1); return *this; } // @cmember Stampa sull'output passato la data void print_on(ostream& out) const ; // @cmember Legge dall'input passato la data void read_from(istream& in) ; // @cmember Ritorna la data in valore numerico operator long() const { return _val; } // @cmember Ritorna l'indirizzo della data in valore numerico operator long*() { return &_val;} // @cmember void | operator const char*() const | | Ritorna la data in formato stringa (chiama ) operator const char*() const ; // @cmember Assegna la data passata come stringa TDate& operator =(const char* s); // @cmember Assegna la data passato come valore numerico TDate& operator =(long val) { _val = val; return *this;} // @cmember Assegna la data passata come oggetto data TDate& operator =(const TDate& d) { _val = d._val; return *this;} // @cmember Costruttore TDate(const TDate& d); // @cmember Costruttore TDate(long l = NULLDATE); // @cmember Costruttore TDate(const char* s); // @cmember Costruttore TDate(int day, int month, int year); }; class TFormatted_date : public TDate { // @cmember Formato per tutti i pezzettini char _format[5]; public: void set_format(const char* f); const char* string() const; TFormatted_date& operator =(const char* s) { TDate::operator =(s); return *this; } TFormatted_date& operator =(const TDate& d) { TDate::operator =(d); return *this; } TFormatted_date& operator =(const TFormatted_date& d) { TDate::operator =(d); set_format(d._format); return *this; } TFormatted_date(int day = 0, int month = 0, int year = 0, const char* f = "1444-"); TFormatted_date(const TDate& d, const char* f = "1444-"); TFormatted_date(const TFormatted_date& d); }; TDate& operator +(const TDate& a, long nday) ; TDate& operator +(const long nday, const TDate& b) ; TDate& operator -(const TDate& a, long nday) ; // @func inline bool | operator | Controlla se una data e' minore di un'altra // // @rdesc Ritorna i seguenti valori // // @flag TRUE | Se

e' maggiore di

// @flag FALSE | Se

non e' maggiore di

inline bool operator <( const TDate& a, // @parm Prima data da confrontare const TDate& b) // @parm Secondo data da confrontare { return a._val < b._val;} // @func inline bool | operator | Controlla se una data e' maggiore di un'altra // // @rdesc Ritorna i seguenti valori // // @flag TRUE | Se

e' minore di

// @flag FALSE | Se

non e' minore di

inline bool operator >( const TDate& a, // @parm Prima data da confrontare const TDate& b) // @parm Secondo data da confrontare { return a._val > b._val;} // @func inline bool | operator = | Controlla se una data e' minore o ugaule ad un'altra // // @rdesc Ritorna i seguenti valori // // @flag TRUE | Se

e' minore o uguale a

// @flag FALSE | Se

e' maggiore di

inline bool operator <=( const TDate& a, // @parm Prima data da confrontare const TDate& b) // @parm Secondo data da confrontare { return a._val <= b._val;} // @func inline bool | operator = | Controlla se una data e' maggiore o uguale ad un'altra // // @rdesc Ritorna i seguenti valori // // @flag TRUE | Se

e' maggiore o ugaule a

// @flag FALSE | Se

e' minore di

inline bool operator >=( const TDate& a, // @parm Prima data da confrontare const TDate& b) // @parm Secondo data da confrontare { return a._val >= b._val;} // @func inline bool | operator == | Controlla se 2 date sono uguali // // @rdesc Ritorna i seguenti valori // // @flag TRUE | Se le due date sono uguali // @flag FALSE | Se le due date non sono uguali inline bool operator ==( const TDate& a, // @parm Prima data da confrontare const TDate& b) // @parm Secondo data da confrontare { return a._val == b._val;} // @func inline bool | operator != | Controlla se 2 date sono diverse // // @rdesc Ritorna i seguenti valori // // @flag TRUE | Se le due date sono diverse // @flag FALSE | Se le due date non sono diverse inline bool operator !=( const TDate& a, // @parm Prima data da confrontare const TDate& b) // @parm Secondo data da confrontare { return a._val != b._val;} void swap(TDate& a, TDate& b) ; const TDate& fnc_min(const TDate& a, const TDate& b) ; const TDate& fnc_max(const TDate& a, const TDate& b) ; const char* itom(byte month); const char* itow(byte dayofweek); const TDate botime(0,0,0), eotime(31,12,2050); #endif // __DATE_H