Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
MFC admite varias maneras diferentes de trabajar con fechas y horas:
Compatibilidad con el tipo de datos
DATEde Automatización.DATEadmite valores de fecha, hora y fecha/hora. Las clasesCOleDateTimeyCOleDateTimeSpanencapsulan esta funcionalidad. Funcionan con la claseCOleVariantmediante la compatibilidad con la Automatización.Clases de tiempo de uso general. Las clases
CTimeyCTimeSpanencapsulan 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
CTimecon los tipos de datosSYSTEMTIMEyFILETIMEde 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
COleDateTimeen la hora actual.Realice una tarea que consuma una cantidad de tiempo.
Establezca el otro objeto
COleDateTimeen 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.