/* nMonth可以为负 bKeepMonthIfDayOfMonthOverflow==true 时,当调整月份后该月没有这一天,则保持在这个月最后一天(如:odtTime为201-03-31,nMonth==-1时,调整后日期为2011-02-28) bKeepMonthIfDayOfMonthOverflow==false 时,当调整月份后该月没有这一天,则产生进位(如:odtTime为201-03-31,nMonth==-1时,调整后日期为2011-03-3) */ bool OffsetMonth( IN OUT COleDateTime& odtTime,const int nMonth,bool bKeepMonthIfDayOfMonthOverflow=true) { static int nY,nM,nD,nDeltaM,nDeltaY; nD=odtTime.GetDay(); nM=odtTime.GetMonth(); nY=odtTime.GetYear(); nDeltaM=nMonth%12; nDeltaY=nMonth/12; nY+=nDeltaY; nM+=nDeltaM; if (nM<1)//月借位 { nY-=1; nM+=12; } if (nM>12)//月进位 { nY+=nM/12; nM%=12; } if (nD>28) { COleDateTimeSpan spOneDay(1,0,0,0); COleDateTime temDate(nY,nM,28,0,0,0); int i=1; for ( i=1;i<=4;i++) { temDate+=spOneDay; //CString strMsg=temDate.Format(_T("%Y-%m-%d")); if(temDate.GetMonth()!=nM) { i--; break; } } int nLastDayOfMonth=28+i; if (nD>nLastDayOfMonth) { if (bKeepMonthIfDayOfMonthOverflow) { nD=nLastDayOfMonth; }else{ nD-=nLastDayOfMonth; nM+=1;//天进位 if (nM>12)//月进位 { nY+=nM/12; nM%=12; } } } } odtTime.SetDateTime(nY,nM,nD,odtTime.GetHour(),odtTime.GetMinute(),odtTime.GetSecond()); return true; } bool OffsetDay( IN OUT COleDateTime& odtTime,const int nDays ) { static COleDateTimeSpan spanOneDay(1,0,0,0); odtTime+=spanOneDay*nDays; return true; }