Fecha actual en ANSI C

En este post te voy a mostrar a obtener la fecha actual en C, además de formatearla (para extraer el año, mes, día, etcétera). Las funciones que vamos a ver son: time, localtime y strftime.

Con la función time obtenemos el tiempo (como entero) actual. Usando localtime obtenemos un struct de tipo tm, necesario para más tarde formatear la fecha con strftime.

Aunque suena complicado al inicio, la verdad es que es muy sencillo.

Obtener fecha actual en C

Veamos el siguiente ejemplo de código que muestra la fecha en formato YYYY-MM-DD HH:MM:SS

Primero obtenemos el tiempo actual usando la función time; almacenamos el valor dentro de la variable t.

Más tarde, creamos una variable de tipo tm la cual será el resultado de llamar a localtime pasándole la variable t antes mencionada.

/*
        Obtener y formatear fecha actual
        en C

        https://parzibyte.me/blog
*/#include <stdio.h>
#include <time.h>
int main(void) {
  // Tiempo actual
  time_t t = time(NULL);
  struct tm tiempoLocal = *localtime(&t);
  // El lugar en donde se pondrá la fecha y hora formateadas
  char fechaHora[70];
  // El formato. Mira más en https://en.cppreference.com/w/c/chrono/strftime
  char *formato = "%Y-%m-%d %H:%M:%S";
  // Intentar formatear
  int bytesEscritos =
      strftime(fechaHora, sizeof fechaHora, formato, &tiempoLocal);
  if (bytesEscritos != 0) {
    // Si no hay error, los bytesEscritos no son 0
    printf("Fecha y hora: %s", fechaHora);
  } else {
    printf("Error formateando fecha");
  }
}

Eso es todo lo que necesitas para obtener la fecha actual en ANSI C. A continuación detallaré el uso de las funciones.

Por cierto, la salida es la siguiente:

Obtener fecha actual en C – Compilación y salida del programa

Si quieres compilarlo recuerda instalar el compilador en Windows o Android.

Vamos a la explicación. Sordid details following…

Struct de tipo tm

El tipo tm tiene muchos campos que de hecho ya podríamos usar para obtener los detalles de la fecha como el año, mes o día.

Por ejemplo, para los segundos actuales podríamos acceder a tiempoLocal.tm_sec.

Los campos que tiene (todos enteros) son:

  • tm_sec
  • tm_min
  • tm_hour
  • tm_mday
  • tm_mon
  • tm_year
  • tm_wday
  • tm_yday
  • tm_isdst

Puedes ver una descripción más detallada de esos campos en este enlace.

Como sería un poco complejo usar el struct de tm, mejor usamos strftime que formatea una fecha.

Explicación de strftime

La función strftime necesita un formato como cadena, dicho formato está compuesto de letras que tienen un significado.

De esta forma, %Y-%m-%d %H:%M:%S; se convierte en 2019-07-31 16:36:48.

Cada letra representa un dato que se quiere obtener de la fecha y se usa el signo de porcentaje para indicar que el mismo debe ser remplazado por el valor de la fecha actual.

Por ejemplo:

  • %Y – El año
  • %m – El mes
  • %d – El día
  • %H – La hora en formato de 24 horas
  • %M – Los minutos
  • %S – Los segundos

Hay más formatos que puedes ver aquí.

Si se coloca una letra o carácter que no tiene uso específico, el mismo es ignorado (se puede ver en los dos puntos y en los guiones)

La función strftime toma argumentos en el siguiente orden:

  1. El búfer en donde va a escribir la fecha formateada (debe ser lo suficientemente largo para evitar desbordamientos)
  2. La cantidad de bytes que debe escribir (por eso le pasamos el tamaño, sizeof, del búfer)
  3. El formato, que indica cómo formatear la fecha
  4. La dirección de memoria, o “el apuntador” a la variable del tiempo local

La función strftime en C devuelve el número de bytes que escribió dentro del búfer indicado; pero si hubo un error (por ejemplo, un mal formato de fecha) entonces devuelve 0.

Ese resultado se utiliza para comprobar si el formateo fue correcto, y de esta manera finalmente tenemos la fecha formateada dentro del búfer.

Conclusión

Así de simple se obtiene la fecha y hora actual en C.

Con la función strftime puedes obtener la fecha que quieras, aprendiendo sobre los formateadores y su uso.

Lo sé, yo también creo que es mucho código, pero así es C.

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.