Publi

Obtener la fecha y hora formateada en C

Es un código muy simple, aunque tal vez si estáis empezando os resulte muy útil para que vuestros programas sean capaces de decir la hora o hacer alguna operación con la fecha

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <time.h>
#include <stdio.h>

int main()
{
  time_t t;
  struct tm *tm;
  char fechayhora[100];

  t=time(NULL);
  tm=localtime(&t);
  strftime(fechayhora, 100, "%d/%m/%Y", tm);
  printf ("Hoy es: %s\n", fechayhora);
}

La forma de utilizar strftime() es pasando los siguientes parámetros:

  • Un array de char o char* donde almacenaremos la cadena de caracteres resultante
  • El tamaño máximo de caracteres que podemos ocupar, es decir, el tamaño reservado para la variable anterior
  • El formato en el que queremos presentar los datos, con algunas palabras clave que indicarán dónde va cada uno de los datos, los más importantes son:
    • %s : Número de segundos desde la época: 1 de Enero del 1970 a las 00:00
    • %d : Día del mes (del 01 al 31)
    • %m : Mes (del 01 al 12)
    • %Y : Año (con 4 cifras. Ej: 2012)
    • %y : Año (con 2 cifras. Ej : 12)
    • %H : Horas en formato 24h (de 00 a 23)
    • %I : Horas en formato 12h) (de 01 a 12)
    • %M : Minutos (de 00 a 59)
    • %S : Segundos (de 00 a 59)
    • %z : Huso horario (diferencia horaria con respecto a GMT)
    • %u : Día de la semana (del 1 al 7 donde 1 es Lunes)
    • %w : Día de la semana (del 0 al 6 donde 0 es Domingo)
    • Hay muchos más, para obtener la lista completa, utilizad: «$ man strftime» o «$ man date» en la línea de comandos
  • Puntero a struct tm de donde sacamos la información (debemos llamar siempre previamente a la función localtime()

Bueno, no todo queda ahí, podemos sacar la información directamente del (struct tm*), por ejemplo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <time.h>
#include <stdio.h>

int main()
{
  time_t t;
  struct tm *tm;
  char fechayhora[100];

  t=time(NULL);
  tm=localtime(&t);
  printf ("Hoy es: %02d/%02d/%d\n", tm->tm_mday, tm->tm_mon, 1900+tm->tm_year);
}

Es lo mismo de antes, pero con algunos detalles, por ejemplo el año, cuenta el número de años desde 1900, por lo que si queremos el año completo debemos sumar 1900 como en el ejemplo. Podemos ver la estructura struct tm aquí:

struct tm {
int tm_sec; /* segundos */
int tm_min; /* minutos */
int tm_hour; /* horas */
int tm_mday; /* día del mes */
int tm_mon; /* mes */
int tm_year; /* año */
int tm_wday; /* día de la semana */
int tm_yday; /* día del año */
int tm_isdst; /* cambio horario verano/invierno */
};
Fuente: man localtime

Aunque extraer estos valores directamente de struct tm puede ser incómodo, nos sirve para analizar los datos por separado y obtenerlos como valores enteros, por ejemplo para hacer cálculos. Un buen ejercicio es intentar traducir los nombres de los meses y día de la semana (aunque strftime(), comentada anteriormente es capaz de devolver esta información en el idioma del sistema, en ocasiones el idioma de nuestra aplicación no tiene por qué coincidir), podemos hacer lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <time.h>
#include <stdio.h>

int main()
{
  time_t t;
  struct tm *tm;
  char fechayhora[100];
  char *meses[12]={"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"};

  t=time(NULL);
  tm=localtime(&t);
  printf ("Hoy es: %02d/%s/%d\n", tm->tm_mday, meses[tm->tm_mon], 1900+tm->tm_year);
}

También podría interesarte....

There are 12 comments left Ir a comentario

  1. Pingback: Bitacoras.com /

  2. Daniel1952 /
    Usando Mozilla Firefox Mozilla Firefox 11.0 en Windows Windows XP

    Sos un genio, me pasé un día haciendo funciones para formatear la fecha y pensar que estaba todo hecho( hace 2 meses que estoy estudiando C de forma autodidacta ).

    Saludos.
    Daniel

  3. admin / Post Author
    Usando Mozilla Firefox Mozilla Firefox 24.0 en Ubuntu Linux Ubuntu Linux

    @Daniel1952
    Muchas gracias por tu comentario!! Me alegra haberte sido de ayuda

  4. Bakasa /
    Usando Google Chrome Google Chrome 42.0.2311.90 en Linux Linux

    y la hora? ninguno de tus ejemplos imprime la hora, solo la fecha en diferentes formatos, sos un mentiroso.

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 37.0 en Ubuntu Linux Ubuntu Linux

      Bueeeno, tampoco tan mentiroso, porque en el post hay herramientas para que también pongas la hora. De todas formas, para strfime():
      strftime(fechayhora, 100, «%d/%m/%Y», tm);
      printf («Hoy es: %s\n», fechayhora);

      Y directamente con struct tm:
      printf («Son las: %02d/%02d/%02d\n», tm->tm_hour, tm->tm_min, 1900+tm->tm_sec);

      Pruébalo y me dices, de todas formas, no me estoy inventando nada, sólo he cogido información del post.

  5. Shady /
    Usando Google Chrome Google Chrome 46.0.2490.80 en Windows Windows 7

    Hola, oye quisiera expresar la fecha del sistema en días (así como dijiste con los segundos desde 1970) porque necesito hacer un cálculo de la cantidad de días que he vivido desde mi fecha de nacimiento…
    ¿podrías ayudarme?

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 42.0 en Ubuntu Linux Ubuntu Linux

      Así a bote pronto, se me ocurre que podías sacar el número de segundos desde tu fecha de nacimiento hasta el presente y divides entre 86400 ( 86400 = 60 segundos * 60 minutos * 24 horas ).

      Ya me cuentas.

  6. steve /
    Usando Mozilla Firefox Mozilla Firefox 78.0 en Ubuntu Linux Ubuntu Linux

    en tu primer fragmento de codigo porque declaras una variable time_t y un struct?

    1. Gaspar Fernández / Post Author
      Usando Google Chrome Google Chrome 87.0.4280.88 en Linux Linux

      Hola steve!

      La variable time_t almacena la fecha y hora actuales como un número muy grande. Para un ordenador es muy útil trabajar con ese número, pero a los humanos no nos dice nada. El struct tm es el tiempo desglosado en días, meses, años, horas, minutos y segundos que puede resultar un poco más útil para nosotros.

      Un saludo!

  7. Nesis /
    Usando Google Chrome Google Chrome 89.0.4389.114 en Windows Windows NT

    Yo la verdad soy novata, no he acabado de entender como usar la fecha actual para usarla en operaciones, por ejemplo calcular la edad del usuario sin necesidad de escribir la fecha actual.

    1. Gaspar Fernández / Post Author
      Usando Google Chrome Google Chrome 87.0.4280.88 en Linux Linux

      Hola Nesis!
      Por ejemplo, puedes pedir la fecha de nacimiento del usuario. Y, una vez que tienes la información de fecha actual en un struct tm (día, mes y año) puedes saber la edad = año actual – año de nacimiento y luego hilar un poco más fino utilizando el día y el mes para saber si el usuario ha cumplido años ya o no.

      Al final descubres que hay formas un poco más fáciles de hacerlo, que incluso te lo dan hecho, pero la que te propongo es una buena manera de practicar.

      Un saludo!

Leave a Reply