En el tutorial de hoy vamos a trabajar con C y marcas de tiempo o timestamps para obtener la diferencia entre una fecha y hora y otra.
Te mostraré ejemplos para saber la diferencia que hay entre un timestamp y otro, logrando así calcular el tiempo transcurrido entre 2 marcas de tiempo.
Por otro lado veremos cómo formatear el tiempo transcurrido en C y obtener la diferencia en horas, minutos y segundos.
Para obtener la marca de tiempo actual con C podemos invocar a time
pasándole NULL
como argumento.
time_t inicio = time(NULL);
printf("Inicio: %llu\n", inicio);
Eso devolverá los segundos transcurridos desde la fecha Unix hasta el día de hoy con precisión de segundos. Por ejemplo, si lo invoco al momento de escribir este post, la salida es: 1647395704
Lo que tenemos que hacer para saber la diferencia de tiempos en C es guardar el inicio y luego calcular la diferencia con el final, invocando a la misma función.
Veamos un ejemplo que formatea la diferencia entre 2 marcas de tiempo con C. Básicamente indica cuánto tiempo pasó, tomando en cuenta los segundos de diferencia:
void imprimirDiferencia(time_t diferencia)
{
unsigned long long int horas = diferencia / 60 / 60;
diferencia -= 60 * 60 * horas;
unsigned long long int minutos = diferencia / 60;
diferencia -= 60 * minutos;
printf("%llu hora(s) %llu minuto(s) %llu segundo(s)\n", horas, minutos, diferencia);
}
Recuerda que tenemos segundos, así que para convertirlos a horas los dividimos entre 60 y luego entre 60 (o dividir entre 3600).
Para convertirlos a minutos los dividimos entre 60, y luego de restar horas y minutos ya solo quedarán segundos.
Ya vimos la función, ahora veamos cómo sacar la diferencia. Solo es cuestión de obtener el timestamp en el inicio y en el final:
int main()
{
time_t inicio = time(NULL);
printf("Inicio: %llu\n", inicio);
printf("Presiona Enter cuando quieras\n");
// Esperar a que el usuario presione Enter. Realmente esta espera podría ser cualquiera
// y podría ser en cualquier circunstancia
getchar();
time_t fin = time(NULL);
time_t diferencia = fin - inicio;
imprimirDiferencia(diferencia);
return 0;
}
Cabe aclarar que podríamos hacer esto en cualquier otro lugar, por ejemplo, medir la ejecución del programa, el tiempo en el que el usuario resuelve cierta cosa, etcétera.
Hasta ahora he hablado de “fechas” pero solo hemos visto timestamps. Pues bien, podemos convertir esta marca de tiempo a cualquier fecha con hora.
Para esto podemos invocar a strftime
o usar una función manual. La solución correcta es strftime pero yo te mostraré cómo usar todos los campos de un localtime para imprimirlos por separado:
void imprimirFechaAPartirDeTimestamp(time_t tiempo)
{
struct tm *tm = localtime(&tiempo);
printf("%02d/%02d/%02d %02d:%02d:%02d",
tm->tm_mday, tm->tm_mon + 1,
tm->tm_year + 1900,
tm->tm_hour,
tm->tm_min,
tm->tm_sec);
}
Aquí lo interesante es que podemos acceder al día, mes (contando desde 0), años transcurridos desde 1900 (así es la especificación, yo tampoco sé por qué se hace así), la hora, minutos y segundos.
Recuerda que el formato %02d
imprimirá un entero agregando un cero a la izquierda en caso de que el mismo tenga menos de dos dígitos.
El código final para mostrar la diferencia entre 2 fechas con C queda como se ve a continuación. Recuerda que es un ejemplo simple que puedes adaptar a tus necesidades:
/*
https://parzibyte.me/blog
*/#include <stdio.h>
#include <time.h>
void imprimirDiferencia(time_t diferencia)
{
unsigned long long int horas = diferencia / 60 / 60;
diferencia -= 60 * 60 * horas;
unsigned long long int minutos = diferencia / 60;
diferencia -= 60 * minutos;
printf("%llu hora(s) %llu minuto(s) %llu segundo(s)\n", horas, minutos, diferencia);
}
void imprimirFechaAPartirDeTimestamp(time_t tiempo)
{
struct tm *tm = localtime(&tiempo);
printf("%02d/%02d/%02d %02d:%02d:%02d",
tm->tm_mday, tm->tm_mon + 1,
tm->tm_year + 1900,
tm->tm_hour,
tm->tm_min,
tm->tm_sec);
}
int main()
{
time_t inicio = time(NULL);
printf("Inicio: %llu\n", inicio);
printf("Como fecha: ");
imprimirFechaAPartirDeTimestamp(inicio);
printf("\n");
printf("Presiona Enter cuando quieras\n");
// Esperar a que el usuario presione Enter. Realmente esta espera podría ser cualquiera
// y podría ser en cualquier circunstancia
getchar();
time_t fin = time(NULL);
printf("Fin: %llu\n", fin);
printf("Como fecha: ");
imprimirFechaAPartirDeTimestamp(fin);
printf("\n");
time_t diferencia = fin - inicio;
imprimirDiferencia(diferencia);
return 0;
}
Para terminar te dejo con más tutoriales de lenguaje C en mi blog.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.