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;
}
/***********************************************************************************************/