Changeset 117 for XMLIO_V2/dev/dev_rv/src/XMLIO/calendar.hpp
- Timestamp:
- 07/19/10 14:58:22 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XMLIO_V2/dev/dev_rv/src/XMLIO/calendar.hpp
r116 r117 16 16 17 17 virtual int getMonthLength(const Date& d) const 18 { // Retourne la longueurdu mois en jour.18 { // Retourne la durée du mois en jour. 19 19 static const int NoLeapMonthLength[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 20 20 return (NoLeapMonthLength[d.getMonth()-1]); 21 21 } 22 22 23 virtual int getYearTotalLength(const Date& d) const { return (365 * 86400); } // Retourne la longueurd'une année en seconde.24 25 virtual int getYearLength(void) const { return (12); } // Retourne la longueurd'une année en mois.26 virtual int getDayLength(void) const { return (24); } // Retourne la longueurd'un jour en heures.27 virtual int getHourLength(void) const { return (60); } // Retourne la longueurd'une heure en minute.28 virtual int getMinuteLength(void) const { return (60); } // Retourne la longueurd'une minute en secondes.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 29 30 30 virtual int getNbSecond(const Date& d) const … … 77 77 78 78 virtual int getYearTotalLength(const Date& d) const 79 { // Retourne la longueurd'une année en seconde.79 { // Retourne la durée d'une année en seconde. 80 80 if (d.getYear()%4 == 0) return (366 * 86400); 81 81 return (365 * 86400); … … 83 83 84 84 virtual int getMonthLength(const Date& d) const 85 { // Retourne la longueurdu mois en jour.85 { // Retourne la durée du mois en jour. 86 86 if (d.getMonth() == 2) 87 87 { if (d.getYear()%4 == 0) return 29; return 28; } … … 101 101 102 102 virtual int getYearTotalLength(const Date& d) const 103 { // Retourne la longueurd'une année en seconde.103 { // Retourne la durée d'une année en seconde. 104 104 if ((d.getYear() % 4 == 0) && (d.getYear() % 100 != 0 || d.getYear() % 400 == 0)) return (366 * 86400); 105 105 return (365 * 86400); … … 107 107 108 108 virtual int getMonthLength(const Date& d) const 109 { // Retourne la longueurdu mois en jour.109 { // Retourne la durée du mois en jour. 110 110 if (d.getMonth() == 2) 111 111 { // Traitement du cas particulier en Février. … … 141 141 { if (d.getMonth() == 2) return (29); return AbstractCalendar::getMonthLength(d); } 142 142 143 virtual int getYearTotalLength(const Date& d) const { return (366 * 86400); } // Retourne la longueurd'une année en seconde.143 virtual int getYearTotalLength(const Date& d) const { return (366 * 86400); } // Retourne la durée d'une année en seconde. 144 144 145 145 virtual ~AllLeapCalendar() … … 154 154 {/* Ne rien faire de plus */} 155 155 156 virtual int getYearTotalLength(const Date& d) const { return (360 * 86400); } // Retourne la longueurd'une année en seconde.156 virtual int getYearTotalLength(const Date& d) const { return (360 * 86400); } // Retourne la durée d'une année en seconde. 157 157 virtual int getMonthLength(const Date& d) const { return (30); } 158 158 … … 164 164 165 165 //////////////////////////////////////// 166 Date::operator Time(void) // Non vérifiée (algorithme naïf) 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 ... 167 190 { 168 191 // Todo : Tester si la date courante est supérieure à la date initiale. 169 Time retvalue = - relCalendar.getNbSecond(relCalendar.getInitDate()) + relCalendar.getNbSecond(*this); 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 170 200 for(Date _d(relCalendar.getInitDate()); _d.getYear() < getYear(); _d.setYear(_d.getYear()+1)) 171 201 retvalue += relCalendar.getYearTotalLength(_d); … … 173 203 } 174 204 175 Date operator+(const Date& dt, const Duration& dr); 176 Date operator-(const Date& dt, const Duration& dr); 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 ici 238 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 177 255 178 256 } // namespace XMLIOSERVER
Note: See TracChangeset
for help on using the changeset viewer.