Lenguaje de programación C

Diferencia entre 2 fechas con C (tiempo transcurrido)

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.

Obteniendo timestamp actual

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.

Formatear tiempo transcurrido entre 2 fechas con C

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.

Diferencia entre dos fechas con C

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.

Bonus: convertir timestamp a fecha

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.

Poniendo todo junto

Tiempo transcurrido entre 2 fechas con ANSI C usando time y marcas de tiempo

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.