1、全局变量
int g_nCheckYear = 1901; //校验年份
int g_nCheckMonth = 0; //校验月份
int g_nCheckDay = 0; //校验日
int g_nCheckHour = 0; //校验时
int g_nCheckMinute; //校验分
int g_nEndYear = 0; //截止年份
int g_nEndMonth = 0; //截止月份
int g_nEndDay = 0; //截止日
int g_nEndHour = 0; //截止时
int g_nEndMinute = 0; //截止分
2、全局函数
//判断是否是闰年
bool isLeap(int y)
{
if((y % 4 == 0) && (y % 100 != 0)) //是闰年
return true;
else if(y % 400 == 0) //是闰年
return true;
else //不是闰年
return false;
}
//判断 y年m月 共有的天数
int daysOfMonth(int y,int m)
{
int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(m != 2)
return days[m-1];
else
return 28 + isLeap(y);
}
3、计算截止日期
bool calEndTime(int nUseDays)
{
if(nUseDays <= 0)
return false;
//【1】获取系统当前时间
QDateTime local(QDateTime::currentDateTime());
//【2】校验日期初始化为系统当前时间
g_nCheckYear = local.toString("yyyy").toInt();
g_nCheckMonth = local.toString("MM").toInt();
g_nCheckDay = local.toString("dd").toInt();
g_nCheckHour = local.toString("hh").toInt();
g_nCheckMinute = local.toString("mm").toInt();
//【3】计算截止日期
//剩余时间
int tempSurplusTime = nUseDays;
//初始化 截止年、日、时、分 为 当前时间
g_nEndYear = g_nCheckYear;
g_nEndDay = g_nCheckDay;
g_nEndHour = g_nCheckHour;
g_nEndMinute = g_nCheckMinute;
//创建临时变量 当前月、下个月,初始化为当前日期的月
int tempCurrMonth = g_nCheckMonth;
int tempNextMonth = g_nCheckMonth;
//计算当前月共有多少天
int tempDaysOfMonth = daysOfMonth(g_nEndYear, tempCurrMonth);
//判断 剩余时间 是否可以将当前月剩余天数补全
if(tempSurplusTime > (tempDaysOfMonth - g_nEndDay)) //如果可以将当前月剩余天数补全 且 有剩余
{
tempSurplusTime = tempSurplusTime - (tempDaysOfMonth - g_nEndDay);
//判断当前月是否是 12月
if(tempCurrMonth < 12) //不是
{
tempNextMonth += 1;
}
else //是
{
tempNextMonth = 1;
g_nEndYear += 1; //年份 加1
}
//截止日 临时设置为 当前月 月底
g_nEndDay = tempDaysOfMonth;
}
else //如果剩余时间 刚好可以将当前月剩余天数补全 或者不能将当前月剩余天数补全
{
g_nEndDay += tempSurplusTime; //截止日 就是tempSurplusTime 之后的那天
g_nEndYear = g_nCheckYear;
g_nEndMonth = g_nCheckMonth;
// 结束操作
return true;
}
//连续计算下个月的天数,用剩余时间 与它比较
while(true)
{
//计算下个月共有多少天
int tempDaysOfMonth = dateManage.daysOfMonth(g_nEndYear, tempNextMonth);
//判断下个月是否是 12月
if(tempNextMonth < 12) //不是
{
//判断 剩余时间 是否大于 下个月天数
if(tempSurplusTime > tempDaysOfMonth) //剩余时间 大于 下个月天数
{
tempSurplusTime -= tempDaysOfMonth;
tempNextMonth += 1;
}
else //剩余时间 小于或等于 下个月天数
{
g_nEndMonth = tempNextMonth; //截止月 即是 下个月
g_nEndDay = tempSurplusTime; //截止日 即是 剩余时间
break;
}
}
else //是
{
//判断 剩余时间 是否大于 下个月天数
if(tempSurplusTime > tempDaysOfMonth) //剩余时间 大于 下个月天数
{
tempSurplusTime -= tempDaysOfMonth;
tempNextMonth = 1;
g_nEndYear += 1; //年份 加1
}
else //剩余时间 小于或等于 下个月天数
{
g_nEndMonth = tempNextMonth; //截止月 即是 下个月
g_nEndDay = tempSurplusTime; //截止日 即是 剩余时间
break;
}
}
}
return true;
}