晚上坐车到单位的路上,一直在想这个问题,本来想倒退几个月嘛,应该很容易,但是实际做起来,就稍微有点麻烦了,倒退几个月?一个两个?是否倒退到前一年去了,前n年去了,那天下午在些这个代码,晚上做公交车,在车上一直在想这个问题,等下车的时候,终于想出来。也许写的有点累赘。
COleDateTime CSPI::Fun_PreTime(int year, int month, int pre_time)
{
/*year:当前年份
month:当前月份
pre_time:向前返回的月的个数
*/
COleDateTime time;
int flag=month-pre_time;
if (pre_time==1) {//如果是一个月的话,就是本月,当即返回
time.SetDate(year,month,1);
return time;
}
if (flag<0) {
//出现12会在上一年的范围内,但是多于12个月的情况,就会到前一年,依次类推
int pre_year=(int)((abs(flag)+12-1)/12);//上取整
year=year-pre_year;
if(abs(flag)<=12)//在两年的跨度范围之内
{
month=(month-pre_time)+13;
}
else//超出两年的跨度范围
{
if (abs(flag)%12!=0) {
month=13-(int)(abs(flag)%12);
}
else if(abs(flag)%12==0)// 因为是倒数,正好12个月倒退到1月份
month=1;
//返回超过两年的月份
}
time.SetDate(year,month,1);
return time;
}else
time.SetDate(year,flag+1,1);
return time;
}
程序如果将if分的细的话,执行效率会比较高。
也许vc++中有这样现成的函数。
呵呵,虽然很简单,些在着了,以备以后留用。
COleDateTime CSPI::Fun_PreTime(int year, int month, int pre_time)
{
/*year:当前年份
month:当前月份
pre_time:向前返回的月的个数
*/
COleDateTime time;
int flag=month-pre_time;
if (pre_time==1) {//如果是一个月的话,就是本月,当即返回
time.SetDate(year,month,1);
return time;
}
if (flag<0) {
//出现12会在上一年的范围内,但是多于12个月的情况,就会到前一年,依次类推
int pre_year=(int)((abs(flag)+12-1)/12);//上取整
year=year-pre_year;
if(abs(flag)<=12)//在两年的跨度范围之内
{
month=(month-pre_time)+13;
}
else//超出两年的跨度范围
{
if (abs(flag)%12!=0) {
month=13-(int)(abs(flag)%12);
}
else if(abs(flag)%12==0)// 因为是倒数,正好12个月倒退到1月份
month=1;
//返回超过两年的月份
}
time.SetDate(year,month,1);
return time;
}else
time.SetDate(year,flag+1,1);
return time;
}
程序如果将if分的细的话,执行效率会比较高。
也许vc++中有这样现成的函数。
呵呵,虽然很简单,些在着了,以备以后留用。