Ignore:
Timestamp:
07/19/10 14:58:22 (14 years ago)
Author:
hozdoba
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • XMLIO_V2/dev/dev_rv/src/XMLIO/calendar.hpp

    r116 r117  
    1616 
    1717         virtual int getMonthLength(const Date& d) const 
    18          { // Retourne la longueur du mois en jour. 
     18         { // Retourne la durée du mois en jour. 
    1919            static const int NoLeapMonthLength[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 
    2020            return (NoLeapMonthLength[d.getMonth()-1]); 
    2121         } 
    2222 
    23          virtual int getYearTotalLength(const Date& d) const { return (365 * 86400); } // Retourne la longueur d'une année en seconde. 
    24  
    25          virtual int getYearLength(void)   const { return (12); } // Retourne la longueur d'une année en mois. 
    26          virtual int getDayLength(void)    const { return (24); } // Retourne la longueur d'un jour en heures. 
    27          virtual int getHourLength(void)   const { return (60); } // Retourne la longueur d'une heure en minute. 
    28          virtual int getMinuteLength(void) const { return (60); } // Retourne la longueur d'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. 
    2929 
    3030         virtual int getNbSecond(const Date& d) const 
     
    7777 
    7878         virtual int getYearTotalLength(const Date& d) const 
    79          { // Retourne la longueur d'une année en seconde. 
     79         { // Retourne la durée d'une année en seconde. 
    8080            if (d.getYear()%4 == 0) return (366 * 86400); 
    8181            return (365 * 86400); 
     
    8383 
    8484         virtual int getMonthLength(const Date& d) const 
    85          { // Retourne la longueur du mois en jour. 
     85         { // Retourne la durée du mois en jour. 
    8686            if (d.getMonth() == 2) 
    8787            { if (d.getYear()%4 == 0) return 29; return 28; } 
     
    101101 
    102102         virtual int getYearTotalLength(const Date& d) const 
    103          { // Retourne la longueur d'une année en seconde. 
     103         { // Retourne la durée d'une année en seconde. 
    104104            if ((d.getYear() % 4 == 0) && (d.getYear() % 100 != 0 || d.getYear() % 400 == 0)) return (366 * 86400); 
    105105            return (365 * 86400); 
     
    107107 
    108108         virtual int getMonthLength(const Date& d) const 
    109          { // Retourne la longueur du mois en jour. 
     109         { // Retourne la durée du mois en jour. 
    110110            if (d.getMonth() == 2) 
    111111            { // Traitement du cas particulier en Février. 
     
    141141         { if (d.getMonth() == 2) return (29); return AbstractCalendar::getMonthLength(d); } 
    142142 
    143          virtual int getYearTotalLength(const Date& d) const { return (366 * 86400); } // Retourne la longueur d'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. 
    144144 
    145145         virtual ~AllLeapCalendar() 
     
    154154         {/* Ne rien faire de plus */} 
    155155 
    156          virtual int getYearTotalLength(const Date& d) const { return (360 * 86400); } // Retourne la longueur d'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. 
    157157         virtual int getMonthLength(const Date& d) const { return (30); } 
    158158 
     
    164164 
    165165   //////////////////////////////////////// 
    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 ... 
    167190   { 
    168191      // 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 
    170200      for(Date _d(relCalendar.getInitDate()); _d.getYear() < getYear(); _d.setYear(_d.getYear()+1)) 
    171201         retvalue += relCalendar.getYearTotalLength(_d); 
     
    173203   } 
    174204 
    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 
    177255 
    178256} // namespace XMLIOSERVER 
Note: See TracChangeset for help on using the changeset viewer.