Udostępnij za pośrednictwem


Data i godzina

MFC obsługuje kilka różnych sposobów pracy z datami i godzinami:

  • Obsługa typu danych usługi Automation.DATE DATE obsługuje wartości daty, godziny i daty/godziny. Klasy COleDateTime i COleDateTimeSpan hermetyzują tę funkcję. Pracują z klasą COleVariant przy użyciu obsługi automatyzacji.

  • Klasy czasu ogólnego przeznaczenia. Klasy CTime i CTimeSpan hermetyzują większość funkcji skojarzonych z biblioteką czasu standardowego ANSI, która jest zadeklarowana w pliku time.h.

  • Obsługa zegara systemowego. W wersji 3.0 MFC dodano obsługę CTime dla typów danych Win32 i FILETIME Win32SYSTEMTIME.

Data i godzina: obsługa automatyzacji

Klasa COleDateTime zapewnia sposób reprezentowania informacji o dacie i godzinie. Zapewnia dokładniejszy stopień szczegółowości i większy zakres niż CTime klasa. Klasa COleDateTimeSpan reprezentuje czas, który upłynął, na przykład różnicę między dwoma COleDateTime obiektami.

Klasy COleDateTime i COleDateTimeSpan są przeznaczone do użytku z klasą COleVariant . COleDateTimeCOleDateTimeSpan również przydatne w programowaniu baz danych MFC, ale mogą być używane za każdym razem, gdy chcesz manipulować wartościami daty i godziny. COleDateTime Mimo że klasa ma większy zakres wartości i dokładniejszy stopień szczegółowości niż CTime klasa, wymaga więcej magazynu na obiekt niż CTime. Istnieją również pewne specjalne zagadnienia dotyczące pracy z bazowym typem DATE. Aby uzyskać więcej informacji na temat implementacji programu DATE, zobacz DATE Typ.

COleDateTime obiekty mogą służyć do reprezentowania dat między 1 stycznia 100 a 31 grudnia 9999. COleDateTime obiekty są wartościami zmiennoprzecinkowymi z przybliżoną rozdzielczością 1 milisekund. COleDateTime jest oparty na typie DATE danych zdefiniowanym w dokumentacji MFC w obszarze COleDateTime::operator DATE. Rzeczywista implementacja DATE wykracza poza te granice. Implementacja COleDateTime nakłada te ograniczenia, aby ułatwić pracę z klasą.

COleDateTime nie obsługuje dat Juliana. Przyjmuje się, że kalendarz gregoriański ma być przedłużany w czasie do 1 stycznia 100 roku.

COleDateTime ignoruje czas letni (DST). Poniższy przykład kodu porównuje dwie metody obliczania przedziału czasu, który przekracza datę przełączania DST: jeden przy użyciu CRT, a drugi przy użyciu metody COleDateTime.

Pierwsza metoda ustawia dwa CTime obiekty i time2time1 , odpowiednio na 5 kwietnia i 6 kwietnia, używając standardowych struktur tm typów języka C i time_t. Zostanie wyświetlony time1 kod i time2 przedział czasu między nimi.

Druga metoda tworzy dwa COleDateTime obiekty i oletime1oletime2, i ustawia je na te same daty co time1 i time2. Zostanie on wyświetlony oletime1 i oletime2 przedział czasu między nimi.

CRT poprawnie oblicza różnicę 23 godzin. COleDateTimeSpan oblicza różnicę 24 godzin.

void CDTDlg::OnPaint()
{
   CPaintDC dc(this); // device context for painting

   time_t date1_t, date2_t;
   tm date_tm;

   date_tm.tm_hour = 12;
   date_tm.tm_min = 0;
   date_tm.tm_mon = 3;
   date_tm.tm_sec = 0;
   date_tm.tm_wday = 0; //Day of week (0-6; Sunday = 0)
   date_tm.tm_yday = 0;
   date_tm.tm_year = 97;
   date_tm.tm_isdst = -1; //Positive if Daylight Saving Time is in effect;
                         //0 if Daylight Saving Time is not in effect; 
                         //Negative if status of DST is unknown.

   date_tm.tm_mday = 6;
   date2_t = mktime(&date_tm);

   date_tm.tm_mday = 5;
   date_tm.tm_isdst = 0;
   date1_t = mktime(&date_tm);

   CTime time1(date1_t), time2(date2_t);
   CTimeSpan ts = time2 - time1;

   dc.TextOut(0, 0, CString(_T("CTime")));
   dc.TextOut(0, 20, time1.Format(_T("%H:%M:%S %A, %B %d, %Y")));
   dc.TextOut(0, 40, time2.Format(_T("%H:%M:%S %A, %B %d, %Y")));
   dc.TextOut(0, 60, ts.Format(_T("%H:%M:%S and %D days")));


   COleDateTime oletime1(date1_t), oletime2(date2_t);
   COleDateTimeSpan olets = oletime2 - oletime1;

   dc.TextOut(0, 120, CString(_T("COleDateTime")));
   dc.TextOut(0, 140, oletime1.Format(_T("%H:%M:%S %A, %B %d, %Y")));
   dc.TextOut(0, 160, oletime2.Format(_T("%H:%M:%S %A, %B %d, %Y")));
   
   //Work-around bug in COleDateTime::Format("%D")
   CString str;
   str.Format(_T("%s and %d days"), (LPCTSTR)olets.Format(_T("%H:%M:%S")), 
      olets.GetDays());
   dc.TextOut(0, 180, str);
}

Pobieranie bieżącej godziny

Poniższa procedura pokazuje, jak utworzyć COleDateTime obiekt i zainicjować go przy użyciu bieżącej godziny.

Aby uzyskać bieżącą godzinę

  1. Utwórz COleDateTime obiekt.

  2. Wywołaj polecenie GetCurrentTime.

    COleDateTime timeNow;
    timeNow = COleDateTime::GetCurrentTime();   
    

Obliczanie czasu, który upłynął

Ta procedura pokazuje, jak obliczyć różnicę między dwoma COleDateTime obiektami i uzyskać COleDateTimeSpan wynik.

Aby obliczyć czas, który upłynął

  1. Utwórz dwa COleDateTime obiekty.

  2. Ustaw jeden z COleDateTime obiektów na bieżący czas.

  3. Wykonywanie czasochłonnego zadania.

  4. Ustaw inny COleDateTime obiekt na bieżący czas.

  5. Weź różnicę między dwoma razy.

    COleDateTime timeStart, timeEnd;
    timeStart = COleDateTime::GetCurrentTime();
    // ... perform time-consuming task
    timeEnd = COleDateTime::GetCurrentTime();
    COleDateTimeSpan spanElapsed = timeEnd - timeStart;   
    

Formatowanie godziny

Aby sformatować czas

Użyj funkcji składowej FormatCOleDateTimeCOleDateTimeSpan albo, aby utworzyć ciąg znaków reprezentujący czas lub czas, który upłynął.

COleDateTime time(1970, 12, 18, 17, 30, 0);
// 18 December 1970, 5:30 PM
CString s = time.Format(VAR_DATEVALUEONLY);
// s contains the date formatted based on 
// the current national language specifications
// (locale ID). The time portion is ignored for 
// formatting purposes in this case.   

Aby uzyskać więcej informacji, zobacz klasa COleVariant.

Data i godzina: obsługa bazy danych

Począwszy od wersji 4.0, programowanie baz danych MFC używa COleDateTime klas i COleDateTimeSpan do reprezentowania danych daty i godziny. Te klasy, używane również w usłudze Automation, pochodzą z klasy COleVariant. Zapewniają one lepszą obsługę zarządzania danymi daty i godziny niż do CTime i CTimeSpan.

Data i godzina: SYSTEMTIME pomoc techniczna

Klasa COleDateTime ma konstruktory, które akceptują czasy systemu i plików z Win32.

Struktura Win32 FILETIME reprezentuje czas jako wartość 64-bitową. Jest to wygodniejszy format magazynu wewnętrznego niż SYSTEMTIME struktura i format używany przez win32 do reprezentowania czasu tworzenia pliku. Aby uzyskać informacje o SYSTEMTIME strukturze, zobacz SYSTEMTIME. Aby uzyskać informacje o FILETIME strukturze, zobacz FILETIME.

Zobacz też

Pojęcia
Tematy ogólne dotyczące MFC