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. KlasyCOleDateTime
iCOleDateTimeSpan
hermetyzują tę funkcję. Pracują z klasąCOleVariant
przy użyciu obsługi automatyzacji.Klasy czasu ogólnego przeznaczenia. Klasy
CTime
iCTimeSpan
hermetyzują większość funkcji skojarzonych z biblioteką czasu standardowego ANSI, która jest zadeklarowana w plikutime.h
.Obsługa zegara systemowego. W wersji 3.0 MFC dodano obsługę
CTime
dla typów danych Win32 iFILETIME
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
. COleDateTime
są COleDateTimeSpan
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 time2
time1
, 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 oletime1
oletime2
, 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ę
Utwórz
COleDateTime
obiekt.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ął
Utwórz dwa
COleDateTime
obiekty.Ustaw jeden z
COleDateTime
obiektów na bieżący czas.Wykonywanie czasochłonnego zadania.
Ustaw inny
COleDateTime
obiekt na bieżący czas.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 Format
COleDateTime
COleDateTimeSpan
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
.