Qt 2日前間隔日数の計算


ある大神が書いた
少し書き直した
コメントを無視してください
//      
/***********************************************************************************************/
bool Widget::IsLeap(int year)
{
   return (year % 4 ==0 || year % 400 ==0) && (year % 100 !=0);                     //       
}
bool Widget::StringToDate(QString date ,int& year, int& month, int& day)            //    
{
    year = date.mid(0,4).toInt();                                                   //    
    month = date.mid(4,2).toInt();                                                  //    
    day = date.mid(6,2).toInt();                                                    //    

    int DAY[12]={31,28,31,30,31,30,31,31,30,31,30,31};                              //   12      
    if(IsLeap(year))                                                                //     ,   2       29 
    {
         DAY[1] = 29;
    }
    return year >= 0 && month<=12 && month>0 && day<=DAY[month-1] && day>0;         //    ,         ,   ,               //    ,              
}
int Widget::DayInYear(int year, int month, int day)
{
    int DAY[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    if(IsLeap(year))
        DAY[1] = 29;
    for(int i=0; i<month - 1; ++i)
    {
        day += DAY[i];
    }
    return day;
}
int Widget::DaysBetween2Date(QString date1, QString date2)                                                                //    
{
                                                                                                                        //         
     int year1, month1, day1;
     int year2, month2, day2;
     if(!StringToDate(date1, year1, month1, day1) || !StringToDate(date2, year2,month2,day2))                           //      
     {
        return -1;                                          //        ,     -1
     }
     if(year1 == year2 && month1 == month2)                 //      ,           
     {
          return day1 > day2 ? day1 - day2 : day2 - day1;
     }
     else if(year1 == year2)                                //      ,
     {
         int d1, d2;
         d1 = DayInYear(year1, month1, day1);               //              
         d2 = DayInYear(year2, month2, day2);
         return d1 > d2 ? d1 - d2 : d2 - d1;
     }
     else                                                   //      ,     
     {
         if(year1 > year2)                                  //          ,       
         {
             swap(year1, year2);                            //                         
             swap(month1, month2);
             swap(day1, day2);
         }
         int d1,d2,d3;
         if(IsLeap(year1))
             d1 = 366 - DayInYear(year1,month1, day1);
         else
             d1 = 365 - DayInYear(year1,month1, day1);
         d2 = DayInYear(year2,month2,day2);
         d3 = 0;
         for(int year = year1 + 1; year < year2; year++)
         {
             if(IsLeap(year))
                 d3 += 366;
             else
                 d3 += 365;
         }
         return d1 + d2 + d3;
     }
}
void Widget::swap(int a,int b)                      //               
{
    a=a^b;
    b=a^b;
    a=a^b;
}
/***********************************************************************************************/