Fecha y hora
MFC admite varias maneras diferentes de trabajar con fechas y horas:
Compatibilidad con el tipo de datos
DATE
de Automatización.DATE
admite valores de fecha, hora y fecha/hora. Las clasesCOleDateTime
yCOleDateTimeSpan
encapsulan esta funcionalidad. Funcionan con la claseCOleVariant
mediante la compatibilidad con la Automatización.Clases de tiempo de uso general. Las clases
CTime
yCTimeSpan
encapsulan la mayor parte de la funcionalidad asociada a la biblioteca de tiempo estándar ANSI, que se declara entime.h
.Compatibilidad con el reloj del sistema. Con la versión 3.0 de MFC, se agregó compatibilidad a
CTime
con los tipos de datosSYSTEMTIME
yFILETIME
de Win32.
Fecha y hora: Compatibilidad con la Automatización
La clase COleDateTime
proporciona una manera de representar información de fecha y hora. Proporciona una granularidad más fina y un intervalo mayor que la clase CTime
. La clase COleDateTimeSpan
representa el tiempo transcurrido, como la diferencia entre dos objetos COleDateTime
.
Las clases COleDateTime
y COleDateTimeSpan
están diseñadas para su uso con la clase COleVariant
. COleDateTime
y COleDateTimeSpan
también son útiles en la programación de bases de datos de MFC, pero se pueden usar siempre que quiera manipular valores de fecha y hora. Aunque la clase COleDateTime
tiene un intervalo mayor de valores y una granularidad más fina que la clase CTime
, requiere más almacenamiento por objeto que CTime
. También hay algunas consideraciones especiales al trabajar con el tipo DATE subyacente. Para obtener más información sobre la implementación de DATE
, consulte Tipo DATE
.
Los objetos COleDateTime
se pueden usar para representar fechas entre el 1 de enero del año 100 y el 31 de diciembre de 9999. Los objetos COleDateTime
son valores de punto flotante, con una resolución aproximada de 1 milisegundo. COleDateTime
se basa en el tipo de datos DATE
, definido en la documentación de MFC en COleDateTime::operator DATE
. La implementación real de DATE
se extiende más allá de estos límites. La implementación de COleDateTime
impone estos límites para facilitar el trabajo con la clase.
COleDateTime
no admite fechas del calendario juliano. Se da por supuesto que el calendario gregoriano se extiende hacia atrás en el tiempo hasta el 1 de enero del año 100.
COleDateTime
omite el horario de verano (DST). En el ejemplo de código siguiente, se comparan dos métodos para calcular un intervalo de tiempo que cruza la fecha de conmutación de DST: uno con CRT y el otro con COleDateTime
.
El primer método establece dos objetos CTime
, time1
y time2
, en el 5 de abril y el 6 de abril, respectivamente, mediante las estructuras estándar de tipo C tm
y time_t
. El código muestra time1
y time2
, y el intervalo de tiempo entre ellos.
El segundo método crea dos objetos COleDateTime
, oletime1
y oletime2
, y los establece en las mismas fechas que time1
y time2
. Muestra oletime1
y oletime2
, y el intervalo de tiempo entre ellos.
CRT calcula correctamente una diferencia de 23 horas. COleDateTimeSpan
calcula una diferencia de 24 horas.
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);
}
Obtener la hora actual
En el procedimiento siguiente, se muestra cómo crear un objeto COleDateTime
e inicializarlo con la hora actual.
Obtención de la hora actual
Crear un objeto
COleDateTime
.Llame a
GetCurrentTime
.COleDateTime timeNow; timeNow = COleDateTime::GetCurrentTime();
Cálculo del tiempo transcurrido
En este procedimiento, se muestra cómo calcular la diferencia entre dos objetos COleDateTime
y obtener un resultado COleDateTimeSpan
.
Cálculo del tiempo transcurrido
Cree dos objetos
COleDateTime
.Establezca uno de los objetos
COleDateTime
en la hora actual.Realice una tarea que consuma una cantidad de tiempo.
Establezca el otro objeto
COleDateTime
en la hora actual.Tome la diferencia entre las dos horas.
COleDateTime timeStart, timeEnd; timeStart = COleDateTime::GetCurrentTime(); // ... perform time-consuming task timeEnd = COleDateTime::GetCurrentTime(); COleDateTimeSpan spanElapsed = timeEnd - timeStart;
Dar formato a una hora
Dar formato a una hora
Use la función miembro Format
de COleDateTime
o COleDateTimeSpan
para crear una cadena de caracteres que represente la hora o el tiempo transcurrido.
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.
Para obtener más información, vea la clase COleVariant
.
Fecha y hora: compatibilidad con bases de datos
A partir de la versión 4.0, la programación de bases de datos de MFC usa las clases COleDateTime
y COleDateTimeSpan
para representar datos de fecha y hora. Estas clases, que también se usan en la Automatización, se derivan de la clase COleVariant
. Proporcionan una mejor compatibilidad con la administración de datos de fecha y hora que CTime
y CTimeSpan
.
Fecha y hora: compatibilidad con SYSTEMTIME
La clase COleDateTime
tiene constructores que aceptan las horas de archivo y del sistema de Win32.
La estructura FILETIME
de Win32 representa el tiempo como un valor de 64 bits. Es un formato más cómodo para el almacenamiento interno que una estructura SYSTEMTIME
y es el formato utilizado por Win32 para representar la hora de creación de un archivo. Consulte SYSTEMTIME
para obtener más información sobre la estructura SYSTEMTIME
. Consulte FILETIME
para obtener más información sobre la estructura FILETIME
.