lunes, 21 de septiembre de 2015

Fecha y hora en C++: struct tm vs time_t vs timeval

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;

No hay comentarios: