[MFC] CTime sau COleDateTime?

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] CTime sau COleDateTime?

Post by Ovidiu Cucu » 12 Sep 2007, 13:29

Intrebare
In MFC exista 2 clase pentru lucru cu data calendaristica si timp: CTime si COleDateTime. Pe care dintre ele ar fi mai bine sa o folosim?

Raspuns
Urmatoarele argumente pledeaza in favoarea lui COleDateTime:
  1. CTime incapsuleaza date cuprinse intre 1 ianuarie 1970 si 19 ianuarie 2038. Pentru multe aplicatii este insuficient (exemplu: intr-o baza de date pot exista persoane nascute inainte de 1970). COleDateTime poate handlui date intre 1 ianuarie 100 si 31 decembrie 9999, mult mult mai acoperitor.
    Exemplu

    Code: Select all

       // my birth date is 
       CTime t(1961, 8, 17);
       
       CString strBirthDate = t.Format(_T("%d.%m.%Y"));
       // results "08.01.1984" - I would like it, but it's not real :-)
    
       COleDateTime odt(1961, 8, 17, 0, 0, 0);
       strBirthDate = odt.Format(_T("%d.%m.%Y"));
       // results "17.08.1961" - correct
  2. COleDateTime are functii de formatare (Format) mai puternice. Pe cand CTime::Format se limiteaza la formatare dupa specificatorii de format dati (%Y, %m, etc), COleDateTime::Format are in plus posibilitatea de a formata "automat" in functie de o limba data sau chiar in functie se limba setata in Control Panel.
    Exemplu

    Code: Select all

       CTime t(2007, 9, 11, 8, 25, 55);
       // hard-coded format
       CString strDateTime = t.Format(_T("%d.%m.%Y %H:%M:%S"));
       // what about English US date-time format is required at a time?
    
       // no sweat using COleDateTime
       COleDateTime odt(2007, 9, 11, 8, 25, 55);
       LCID lcid = 0x409; // 0x409 is the locale ID for English US
       strDateTime = odt.Format(0, 0x409); 
    
       // ...and easier and more "portable" for different languages
       strDateTime = odt.Format();
       // has used the user default language, set in Control Panel. 
  3. COleDateTime are in plus functia inversa functiei Format, COleDateTime::ParseDateTime.
    Exemplu

    Code: Select all

       COleDateTime odt;
       // set odt value given a date-time string
       odt.ParseDateTime(_T("9/12/2007 2:48:17 PM"), 0, 0x409); 
       // CTime has not such a member function
  4. COleDateTime are in plus functii Set (COleDateTime::SetDate si COleDateTime::SetDateTime). La CTime, pentru a schimba data/timpul curent trebuie "jonglat" cu obiecte (temporare).
    Exemplu

    Code: Select all

       COleDateTime odt(2007, 10, 10, 0, 0, 0);
       // sets a new value using SetDateTime:
       odt.SetDateTime(2008, 11, 11, 11, 11, 11);
    
       CTime t(2007, 10, 10, 0, 0, 0);
       // sets a new value assigning a temporary CTime object:
       t = CTime(2008, 11, 11, 11, 11, 11);
  5. CTime tine intern data pe un long int pe cand COleDateTime o tine intr-un tip DATE (double). Astfel COleDateTime este mai precis cand e vorba de operatii cu date relative. In exemplul de mai jos, in versiunea cu CTime/CTimeSpan, din rezultatul final "lipseste" o zi (mai binezis o ora, suficient ca sa "sara" la ziua precedenta).
    Exemplu

    Code: Select all

       COleDateTime odt(1970, 9, 30, 0, 0, 0);
       odt += COleDateTimeSpan(31, 0, 0, 0);
       CString strTime1 = odt.Format(_T("%d.%m.%Y %H:%M:%S"));
       // "31.10.1970 00:00:00"
    
       CTime t(1970, 9, 30, 0, 0, 0);
       t += CTimeSpan(31, 0, 0, 0);
       CString strTime2 = t.Format(_T("%d.%m.%Y %H:%M:%S"));
       // "30.10.1970 23:00:00"
       // hmmm... one hour is missing, jumping back in the previous day!

<< Back to MFC index
Last edited by Ovidiu Cucu on 08 Aug 2011, 18:59, edited 5 times in total.
Reason: am adaugat exemple



Post Reply