[MFC] AddMonth pentru COleDateTime / CTime

Despre MFC, ATL si alte biblioteci C++ de la Microsoft (forum moderat)
Post Reply
User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

[MFC] AddMonth pentru COleDateTime / CTime

Post by Ovidiu Cucu » 20 Sep 2007, 11:39

Intrebare
Exista functii in MFC care sa adauge o luna la un obiect tip COleDateTime sau CTime?
Daca nu, cum se pot implementa?

Raspuns
Nici COleDateTime nici CTime nu au o functie membru de genul asta.
La prima vedere totul s-ar realiza din una-doua linii de cod jongland cu functii Get/Set pentu a incrementa luna curenta sau adaugand un numar fix de zile cu ajutorul lui COleDateTimeSpan repectiv cu CTimeSpan.
Nu sunt cele mai bune solutii, in primul rand pentru ca lunile au un numar variabil de zile (28...31).
O posibila implementare corecta, atat pentru COleDateTime cat si pentru CTime este data in exemplele de mai jos.

Exemplu 1

Code: Select all

void CFoo::AddMonth(COleDateTime& odt)
{
   int nYear  = odt.GetYear();
   int nMonth = odt.GetMonth() + 1;
   if(nMonth > 12)
   {
      nMonth = 1;
      ++nYear;
   }
   // construct first day of next month  
   COleDateTime odtNext(nYear, nMonth, 1, 0, 0, 0); 
   // get the number of days in the next month
   int nDays = GetDaysOfMonth(odtNext);
   // new day is the min. from current day and the month days
   int nNewDay = min(nDays, odt.GetDay());
   // set new date
   odt.SetDate(nYear, nMonth, nNewDay);
}
Exemplu 2

Code: Select all

void CFoo::AddMonth(CTime& t)
{
   int nYear  = t.GetYear();
   int nMonth = t.GetMonth() + 1;
   if(nMonth > 12)
   {
      nMonth = 1;
      ++nYear;
   }
   // construct first day of next month  
   CTime tNext(nYear, nMonth, 1, 0, 0, 0); 
   // get the number of days in the next month
   int nDays = GetDaysOfMonth(tNext);
   // construct the date for next month
   int nNewDay = min(nDays, t.GetDay());
   CTime tNew(nYear, nMonth, 
              nNewDay, 
              t.GetHour(), t.GetMinute(), t.GetSecond());
   // assign the new date
   t = tNew;
}
Note:
  1. Implementarile pentru GetDaysOfMonth le gasiti la Cate zile are luna?
  2. Implementarea pentru CTime difera putin fata de cea pentru COleDateTime.
    De ce, puteti afla la CTime sau COleDateTime?
  3. Tema pentru acasa :) : pornind de la exemplele de mai sus implementati functia AddMonth pentru clase derivate din COleDateTime si respectiv din CTime.

<< Back to MFC index



Post Reply