Changeset 118 for XMLIO_V2/dev/dev_rv/src/XMLIO/calendar.hpp
- Timestamp:
- 07/20/10 10:09:45 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XMLIO_V2/dev/dev_rv/src/XMLIO/calendar.hpp
r117 r118 2 2 #define __XMLIO_CALENDAR__ 3 3 4 #include "date.hpp"5 6 4 namespace XMLIOSERVER 7 5 { 8 9 typedef enum _monthEnum10 { JAN = 1, FEB = 2, MAR = 3, APR = 4 , MAY = 5 , JUN = 6 ,11 JUL = 7, AUG = 8, SEP = 9, OCT = 10, NOV = 11, DEC = 12 } MonthEnum;12 13 class AbstractCalendar : public AbstractObject14 {15 public :16 17 virtual int getMonthLength(const Date& d) const18 { // Retourne la durée du mois en jour.19 static const int NoLeapMonthLength[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};20 return (NoLeapMonthLength[d.getMonth()-1]);21 }22 23 virtual int getYearTotalLength(const Date& d) const { return (365 * 86400); } // Retourne la durée d'une année en seconde.24 25 virtual int getYearLength(void) const { return (12); } // Retourne la durée d'une année en mois.26 virtual int getDayLength(void) const { return (24); } // Retourne la durée d'un jour en heures.27 virtual int getHourLength(void) const { return (60); } // Retourne la durée d'une heure en minute.28 virtual int getMinuteLength(void) const { return (60); } // Retourne la durée d'une minute en secondes.29 30 virtual int getNbSecond(const Date& d) const31 { // Retourne le nombre de secondes écoulées depuis le début de l'année.32 Date _d0(d); int nbday = 0;33 34 for(_d0.setMonth(1); _d0.getMonth() < d.getMonth(); _d0.setMonth(_d0.getMonth()+1))35 nbday += getMonthLength(_d0);36 //std::cout << "nombre de jours : " << nbday << std::endl;37 return ((((nbday + d.getDay()) * getDayLength() + d.getHour())38 * getHourLength() + d.getMinute()) * getMinuteLength() + d.getSecond());39 }40 41 virtual string getMonthName(int _mi) const42 {43 static const string Monthname_str[] =44 { "january", "february", "march" , "april" , "may" , "june" ,45 "july" , "august" , "september", "october", "november", "december" };46 return(Monthname_str[_mi-1]);47 }48 49 virtual const string getMonthShortName(int _mi) const50 { string value = getMonthName(_mi); value.resize(3); return (value); }51 52 const Date& getInitDate(void) const { return(initDate); }53 Date& getCurrentDate(void) { return(currentDate); }54 55 virtual ~AbstractCalendar()56 {/* Ne rien faire de plus */}57 58 protected :59 60 AbstractCalendar() : AbstractObject(), initDate(*this), currentDate(initDate)61 {/* Ne rien faire de plus */}62 AbstractCalendar(const string& _id) : AbstractObject(_id), initDate(*this), currentDate(initDate)63 {/* Ne rien faire de plus */}64 65 private :66 67 const Date initDate;68 Date currentDate;69 70 }; // class AbstractCalendar71 72 6 class JulianCalendar : public AbstractCalendar 73 7 { … … 141 75 { if (d.getMonth() == 2) return (29); return AbstractCalendar::getMonthLength(d); } 142 76 143 virtual int getYearTotalLength(const Date& d) const { return (366 * 86400); } // Retourne la durée d'une année en seconde.77 virtual int getYearTotalLength(const Date& d) const { return (366 * 86400); } 144 78 145 79 virtual ~AllLeapCalendar() … … 154 88 {/* Ne rien faire de plus */} 155 89 156 virtual int getYearTotalLength(const Date& d) const { return (360 * 86400); } // Retourne la durée d'une année en seconde.90 virtual int getYearTotalLength(const Date& d) const { return (360 * 86400); } 157 91 virtual int getMonthLength(const Date& d) const { return (30); } 158 92 … … 162 96 }; // class D360Calendar 163 97 164 165 ////////////////////////////////////////166 167 Duration& Duration::resolve(const AbstractCalendar& c)168 {169 // Simplification de l'écriture des minutes.170 second += modf(minute, &minute) * (float)c.getMinuteLength();171 minute += int(second)/c.getMinuteLength(); second = int(second)%c.getMinuteLength();172 173 // Simplification de l'écriture des heures.174 minute += modf(hour , &hour) * (float)c.getHourLength();175 hour += int(minute)/c.getHourLength(); minute = int(minute)%c.getHourLength();176 177 // Simplification de l'écriture des jours.178 hour += modf(day, &day) * (float)c.getDayLength();179 day += int(hour) /c.getDayLength(); hour = int(hour)%c.getDayLength();180 181 // > Aucune équivalence jour - mois fixée par avance. //182 183 // Simplification de l'écriture des années.184 month += modf(year, &year) * (float)c.getYearLength();185 year += int(month) /c.getYearLength(); month = int(month)%c.getYearLength();186 return (*this);187 }188 189 Date::operator Time(void) // Non vérifiée, pas optimisée ...190 {191 // Todo : Tester si la date courante est supérieure à la date initiale.192 Time retvalue = - relCalendar.getNbSecond(relCalendar.getInitDate())193 + relCalendar.getNbSecond(*this);194 195 if ((relCalendar.getId().compare("D360") == 0) ||196 (relCalendar.getId().compare("AllLeap") == 0) ||197 (relCalendar.getId().compare("NoLeap") == 0))198 return (retvalue + (getYear() - relCalendar.getInitDate().getYear()) * relCalendar.getYearTotalLength(*this));199 200 for(Date _d(relCalendar.getInitDate()); _d.getYear() < getYear(); _d.setYear(_d.getYear()+1))201 retvalue += relCalendar.getYearTotalLength(_d);202 return (retvalue);203 }204 205 Date operator+(const Date& dt, const Duration& dr) // Non testée.206 {207 Duration drr (dr);208 int year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0;209 const AbstractCalendar& c = dt.getRelCalendar();210 211 drr.resolve(dt.getRelCalendar());212 213 // Ajustement des minutes par rapport aux secondes.214 second += dt.getSecond() + drr.second;215 if (second < 0) { minute --; second += c.getMinuteLength(); }216 if (second >= c.getMinuteLength()) { minute ++; second -= c.getMinuteLength(); }217 218 // Ajustement des heures en fonction des minutes.219 minute += dt.getMinute() + drr.minute;220 if (minute < 0) { hour --; minute += c.getHourLength(); }221 if (minute >= c.getHourLength()) { hour ++; minute -= c.getHourLength(); }222 223 // Ajustement des jours en fonction des heures.224 hour += dt.getHour() + drr.hour;225 if (hour < 0) { drr.day --; hour += c.getDayLength(); }226 if (hour >= c.getDayLength()) { drr.day ++; hour -= c.getDayLength(); }227 228 // Ajustement des mois en fonction des jours.229 int signVal = drr.day/fabs(drr.day);230 Date dtt(dt); dtt.addMonth (signVal);231 232 for(; c.getMonthLength(dtt) < fabs(drr.day); dtt.addMonth (signVal))233 { drr.day -= signVal * c.getMonthLength(dtt); drr.month += signVal; }234 235 day += dt.getDay() + drr.day;236 if (day < 0) { drr.month --; day += c.getMonthLength(dtt); }237 if (day >= c.getMonthLength(dtt)) { drr.month ++; day -= c.getMonthLength(dtt); } // << ProblÚme ici238 if (day == 0) day = c.getMonthLength(dtt);239 240 drr.resolve(dt.getRelCalendar());241 242 // Ajustement des années en fonction des mois.243 month += dt.getMonth() + drr.month;244 if (month < 0) { year --; month += c.getYearLength(); }245 if (month >= c.getYearLength()) { year ++; month -= c.getYearLength(); }246 if (month == 0) month = c.getYearLength();247 248 year += dt.getYear() + drr.year;249 250 return (Date(dt.getRelCalendar(), year, month, day, hour, minute, second));251 }252 253 Date operator-(const Date& dt, const Duration& dr) { return (dt + (-dr)); }254 255 256 98 } // namespace XMLIOSERVER 257 99
Note: See TracChangeset
for help on using the changeset viewer.