Datum a čas
MFC podporuje několik různých způsobů práce s daty a časy:
Podpora datového typu Automation
DATE
DATE
podporuje hodnoty data, času a data a času. TytoCOleDateTime
funkce zapouzdřují třídyCOleDateTimeSpan
. Pracují sCOleVariant
třídou pomocí podpory Automation.Třídy pro obecné účely.
CTimeSpan
TřídyCTime
zapouzdřují většinu funkcí přidružených ke standardní knihovně času ANSI, která je deklarována vtime.h
.Podpora systémových hodin. V prostředí MFC verze 3.0 byla přidána
CTime
podpora pro win32SYSTEMTIME
aFILETIME
datové typy.
Datum a čas: Podpora automatizace
Třída COleDateTime
poskytuje způsob, jak znázorňovat informace o datu a čase. Poskytuje jemněji členitost a větší rozsah než CTime
třída. Třída COleDateTimeSpan
představuje uplynulý čas, například rozdíl mezi dvěma COleDateTime
objekty.
Třídy COleDateTime
a COleDateTimeSpan
třídy jsou určeny pro použití s COleVariant
třídou. COleDateTime
a COleDateTimeSpan
jsou také užitečné v programování databáze MFC, ale lze je použít vždy, když chcete manipulovat s hodnotami data a času. COleDateTime
Ačkoli třída má větší rozsah hodnot a jemněji členitost než CTime
třída, vyžaduje více úložiště na objekt než CTime
. Při práci s podkladovým typem DATE je potřeba vzít v úvahu také některé zvláštní aspekty. Další informace o implementaci DATE
naleznete v tématu TypDATE
.
COleDateTime
Objekty lze použít k vyjádření kalendářních dat mezi 1. lednem 100 a 31. prosincem 9999. COleDateTime
objekty jsou hodnoty s plovoucí desetinnou čárkou a přibližným rozlišením 1 milisekund. COleDateTime
je založen na datovém DATE
typu definovaném v dokumentaci MFC v části COleDateTime::operator DATE
. Skutečná implementace DATE
přesahuje tyto hranice. Implementace COleDateTime
tyto hranice ukládá, aby se usnadnila práce s třídou.
COleDateTime
nepodporuje Julian dates. Gregoriánský kalendář se předpokládá, že se prodlouží zpět do 1. ledna 100.
COleDateTime
ignoruje letní čas (DST). Následující příklad kódu porovnává dvě metody výpočtu časového rozsahu, který překračuje datum přechodu DST: jeden pomocí CRT a druhý pomocí COleDateTime
.
První metoda nastaví dva CTime
objekty time1
a time2
, na duben 5 a duben 6 pomocí standardních typů C tm
struktury a time_t
. Kód se zobrazí time1
a time2
časové rozpětí mezi nimi.
Druhá metoda vytvoří dva COleDateTime
objekty oletime1
a oletime2
a nastaví je na stejná kalendářní data jako time1
a time2
. oletime1
Zobrazí a oletime2
časové rozpětí mezi nimi.
CrT správně vypočítá rozdíl 23 hodin. COleDateTimeSpan
vypočítá rozdíl 24 hodin.
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);
}
Získání aktuálního času
Následující postup ukazuje, jak vytvořit COleDateTime
objekt a inicializovat ho s aktuálním časem.
Získání aktuálního času
Vytvoření objektu
COleDateTime
Zavolejte
GetCurrentTime
.COleDateTime timeNow; timeNow = COleDateTime::GetCurrentTime();
Výpočet uplynulého času
Tento postup ukazuje, jak vypočítat rozdíl mezi dvěma COleDateTime
objekty a získat COleDateTimeSpan
výsledek.
Výpočet uplynulého času
Vytvořte dva
COleDateTime
objekty.Nastavte jeden z
COleDateTime
objektů na aktuální čas.Proveďte nějakou časově náročnou úlohu.
Nastavte druhý
COleDateTime
objekt na aktuální čas.Vezměte rozdíl mezi těmito dvěma časy.
COleDateTime timeStart, timeEnd; timeStart = COleDateTime::GetCurrentTime(); // ... perform time-consuming task timeEnd = COleDateTime::GetCurrentTime(); COleDateTimeSpan spanElapsed = timeEnd - timeStart;
Formátování času
Formátování času
Format
Pomocí členské funkce buď COleDateTime
nebo COleDateTimeSpan
vytvořit znakový řetězec představující čas nebo uplynulý čas.
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.
Další informace naleznete v tématu třída COleVariant
.
Datum a čas: Podpora databáze
Počínaje verzí 4.0 používá COleDateTime
programování databáze MFC k reprezentaci dat data a času data a času třídy a COleDateTimeSpan
třídy. Tyto třídy, které se také používají ve službě Automation, jsou odvozeny z třídy COleVariant
. Poskytují lepší podporu pro správu dat data a času než do CTime
a CTimeSpan
.
Datum a čas: SYSTEMTIME
Podpora
Třída COleDateTime
má konstruktory, které přijímají systémové a souborové časy z Win32.
Struktura Win32 FILETIME
představuje čas jako 64bitovou hodnotu. Jedná se o pohodlnější formát pro interní úložiště než SYSTEMTIME
strukturu a formát používaný Win32 k vyjádření času vytvoření souboru. Informace o struktuře SYSTEMTIME
naleznete v tématu SYSTEMTIME
. Informace o struktuře FILETIME
naleznete v tématu FILETIME
.