C++ 已知起始日期和使用天数,计算截止日期

48 篇文章 8 订阅
18 篇文章 0 订阅

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值