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:
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:
- El búfer en donde va a escribir la fecha formateada (debe ser lo suficientemente largo para evitar desbordamientos)
- La cantidad de bytes que debe escribir (por eso le pasamos el tamaño, sizeof, del búfer)
- El formato, que indica cómo formatear la fecha
- 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.