[C] Como usar time.h

Iniciado por Siuto, 6 Marzo 2006, 05:52 AM

0 Miembros y 1 Visitante están viendo este tema.

Siuto

estuve buscando por internet como se usa esta libreria pero no entendi muy bien lo que lei. Especificamente lo que quiero hacer es obtener el mes(1/12) y el dia(1/31), en numero.

Si alguien me puede decir como se hace esto y si hay algun sitio en internet que explique como se usan sus funciones (No que las nombre con una descripcion como todos los que vi).

rir3760

Un ejemplo sobre como imprimir la fecha actual mediante las funciones que mencionas y tambien de una forma mas "manual" es (C estandar):
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define LONG_CADENA 128

int main(void)
{
   time_t fecha;
   struct tm *temp;
   struct tm fecha_tm;
   char salida[LONG_CADENA];
   
   /* obtener fecha (time_t) */
   if ((fecha = time(NULL)) == (time_t) -1)
      return EXIT_FAILURE;
   
   /* obtener fecha (struct tm) */
   temp = localtime(&fecha);
   memcpy(&fecha_tm, temp, sizeof fecha_tm);
   
   /* imprimir mediante las funciones de la biblioteca time.h */
   printf("%s", ctime(&fecha));
   strftime(salida, LONG_CADENA, "%a %b %d %H:%M:%S %Y\n", &fecha_tm);
   printf("%s", salida);
   
   /* imprimir manualmente */
   printf("        %02d %02d:", fecha_tm.tm_mday, fecha_tm.tm_hour);
   printf("%02d:%02d ", fecha_tm.tm_min, fecha_tm.tm_sec);
   printf("%d\n", fecha_tm.tm_year + 1900);
   
   return EXIT_SUCCESS;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Kasswed

Lo primero es saber que en time.h hay una estructura que se llama tm.

Esta estrctura contiene lo siguiente:

struct tm{
       int tm_sec;      //Indica los segundos después de un minuto (o sea los segundos xD)
       int tm_min;      //Indica los minutos depués de una hora (los minutos vaya)
       int tm_hour;     //Indica el numero de horas despues de media noche  (lo que es la hora[0,23])
       int tm_mday;     //El dia del mes[1,31]
       int tm_mon;      //Meses que han pasado dede enero [0,11], por lo tanto Diciembre es el mes 11 y enero el mes 0
       int tm_year;     //Años desde 1900, si quieres saber el año actual sumas 1900
       int tm_wday;     //Dia de la semana, desde el domingo [0,6]
       int tm_yday;     //Dias desde el 1 de Enero [0,365]
       int tm_isdst;    //No se xDD, algo de daylight
       }


Con esa estrcuctua podemos ya obtener todos los dats que queramos. Pero para eso tenemos que gestionar un poco las fechas con algunas funciones, si quremos mostrar la hora del sistema y la fecha del sistem vamos a usar localtime y time. Para ello hay que declarar una variable de timpo time_t que contendrá los datos de la fecha u hora. Y también hay que declarar una estrcutura de tipo tm (la de antes) para obtener de ahí las variables y tal xD. También la estrcutura es un puntero, así que cuando vayamosa investigar dentro lo haremos así: ->. Con un ejemplo se entiende todo mucho mejor :S

#include <stdio.h>
#include <time.h>

int main(){
    time_t ahora;
    struct tm *hora;
    time(&ahora);
    hora = localtime(&ahora);
    printf("%d:%d:%d", hora->tm_hour, hora->tm_min, hora->tm_sec);
    getchar();
    getchar();
    }


Y para la fecha, pues investigamos los datos de la fecha de la estrcutura de antes:

#include <stdio.h>
#include <time.h>

int main(){
    time_t ahora;
    struct tm *fecha;
    time(&ahora);
    fecha = localtime(&ahora);
    printf("%d-%d-%d", fecha->tm_mday, fecha->tm_mon+1, fecha->tm_year+1900);
    getchar();
    getchar();
    }


Esto es lo más básico xD, y a lo mejor algunas te las he explicado mal, pero lo que es la práctica se entiende ¿no?  :P

A groso modo...

Saludos!
"He who allows himself to be insulted, deserves to be."

Repórtame cualquier falta a las normas del foro por mensaje privado.

Siuto

Bueno gracias pude hacer lo que queria pero hay un par de cosas que no las entiendo:

struct tm *hora;
Porque, se declara esto? Y porque como un puntero?

printf("%d:%d:%d", hora->tm_hour, hora->tm_min, hora->tm_sec);
Que es esto: "->", que hace eso?

metallikapo

Cita de: Siuto en  6 Marzo 2006, 16:31 PM
Bueno gracias pude hacer lo que queria pero hay un par de cosas que no las entiendo:

struct tm *hora;
Porque, se declara esto? Y porque como un puntero?

printf("%d:%d:%d", hora->tm_hour, hora->tm_min, hora->tm_sec);
Que es esto: "->", que hace eso?

Hola:
Que sea un puntero a la estructura tm hace que pases por referencia las llamadas a función, lo que ocupa menos stack, Al margen de eso, en varios prototipos de las funciones de time.h se utilizan punteros del tipo struct tm *.

printf("%d:%d:%d", hora->tm_hour, hora->tm_min, hora->tm_sec);
Esto lo que hace es lo siguiente: El %d del printf indica que el argumento que espera recibir es un número entero. Y hora es una variable del tipo struct tm *. Justamente es un puntero a estructura, para llamar a algo que está dentro de la estructura a la que apunta, se utiliza ese formato: hora->tm_hour. Esto da como un resultado un número entero entre 0 y 23, hora->tm_min daría un entero entre 0 y 59, y lo mismo pasaría con hora->tm_sec.

Saludos