En C++ existen 3 tipos de datos para representar la fecha y hora. En este artículo vamos a ver las diferencias entre los tres tipos y cómo se realiza la conversión de uno a otros.
struct tm
Estructura que contiene la fecha y hora dividida en los siguientes campos:
- tm_sec (int)
- tm_min (int)
- tm_hour (int)
- tm_mday (int)
- tm_mon (int)
- tm_year (int)
- tm_wday (int)
- tm_yday (int)
- tm_isdst (int)
time_t
Este tipo es realmente un alias del tipo
int, ya que
time_t almacena el número de segundos transcurridos desde el día 1 de enero de 1970 a las 00:00, lo que comúnmente se conoce como
Epoch Unix.
struct timeval
Estructura que puede considerarse un tipo
time_t ampliado (con más precisión), puesto que incluye los milisegundos de la hora. La estructura está formada por dos campos:
- tv_sec (time_t), segundos transcurridos desde el epoch Unix.
- tv_usec (unsigned int), microsegundos
Crear hora actual
/** time_t **/
time_t ahora_1 = time(0);
/** struct tm **/
struct tm *ahora_2 = localtime(&ahora_1);
/** struct timeval **/
struct timeval ahora_3;
gettimeofday(&ahora_3, NULL);
Conversión entre tipos
/** struct tm --> time_t **/
struct tm origen;
time_t destino = mktime(&origen);
/** struct tm --> timeval **/
//Convertir a time_t y después a timeval
/** time_t --> struct tm **/
time_t origen;
struct tm *destino1 = localtime(&origen);
struct tm *destino2 = gmtime(&origen); // Igual que localtime pero en formato UTC
/** time_t --> timeval **/
time_t origen;
struct timeval destino;
destino.tv_sec = origen;
destino.tv_usec = 0;
/** struct timeval --> struct tm **/
// Convertir a time_t y después a struct tm
/** struct timeval --> time_t **/
struct timeval origen;
time_t destino = (time_t)origen.tvsec;