问题如上所述,下举一例:如截止日期是20051229,月数是12个月,现要倒推回去得到如此的时间段:
起始日期      截至日期 
20051130 -- 20051229
20051030 -- 20051129
20050930 -- 20051029
...............
即求函数 MyFunction(int nMonths,CTIME EndDate),函数返回如上分解的时间段[可能是一个二维整数数组或是其它}?谢谢,让大侠与高手们辛若哪?!

解决方案 »

  1.   

    CTimeSpan类的东东,看看MSDN就非常明白了!
      

  2.   

    CTimeSpan类帮你算的,你调用就好了。具体代码我没有。
      

  3.   

    比较烦,CTimeSpan 只能按天算。
    还得把年、月换成天。
      

  4.   

    这个问题的技巧还是挺高的,源码如下:#include <afx.h>
    #include <time.h>
    #include <iostream>
    using namespace std;BOOL MonthPeriod(int nMonthCount,CTime EndDate, CStringArray &sa)
    {
        int nYear, nTmpYear;
        int nMonth, nTmpMonth;
        int nDay, nTmpDay;
    CString sTmp; time_t tm1;
    tm1 = time(NULL); nYear  = EndDate.GetYear();
    nMonth = EndDate.GetMonth();
    nDay   = EndDate.GetDay();
        
    int nOldMonth = nMonth;
    int nCount    = 0;    struct tm tmSampleData  = { 0, 0, 1, nDay, nMonth - 1, nYear - 1900 };    while(nCount < nMonthCount)
        {
            tmSampleData.tm_mday--;
            time_t tData = mktime(&tmSampleData);
            char szData[20] = { 0 };
            strftime(szData, 20, "%Y-%m-%d", localtime(&tData));
    sscanf(szData, "%4d-%02d-%02d", &nTmpYear, &nTmpMonth, &nTmpDay);        

    if(nTmpMonth != nOldMonth)
    {
    nCount++;
    nOldMonth = nTmpMonth;
    sTmp.Format("%s", szData);
    sa.Add(sTmp);
    }
        }
    return TRUE;
    }void main(void)
    {
    printf("\n TIME PERIOD TEST NOW\n");
    CStringArray sa;
    MonthPeriod(12, CTime(2005, 7, 30, 18, 30, 20), sa);
    for(int j = 0; j < sa.GetSize();  j++)
    cout << sa[j].operator LPCTSTR() << endl; getchar();
    printf("\n");
    }程序输出: TIME PERIOD TEST NOW
    2005-06-30
    2005-05-31
    2005-04-30
    2005-03-31
    2005-02-28
    2005-01-31
    2004-12-31
    2004-11-30
    2004-10-31
    2004-09-30
    2004-08-31
    2004-07-31
      

  5.   

    12月不正是一年吗?一年先按365天记,用CTimeSpan计算出一个起始值,再根据起始年是否是润年来修正起始日期,5行代码就好。