2011-05-10 32 views
5

hola puedo comparar personas con el formato de cumpleaños YYYY-MM-DD con cadena (strcmp). pero necesito comparar la fecha de hoy con el cumpleaños de la persona para mostrar si su cumpleaños es en 7 días o no_ ?. Busqué la biblioteca "time.h" pero no pude manejarla. lo valoro si puedes ayudar.Comparando fechas en C con (Usando la biblioteca time.h)

+0

¿Es esta tarea? –

Respuesta

5

me gustaría utilizar difftime sobre los valores time_t y comparar con el número de segundos en una semana ...

+0

entonces, ¿cómo puedo convertir la cadena por ejemplo "2010-11-10" en una variable time_t para comparar la fecha actual? Y también estoy leyendo la cadena de cumpleaños de la persona desde un archivo – quartaela

+0

Puede cargar los valores en los campos de ' struct tm' y luego usa 'mktime' para obtener un valor' time_t'. Solo asegúrese de que todos los campos que no se usan estén limpios a 0. –

+0

amigo, supongo que este mktime mostrará qué día nació esta persona. pero lo necesito si el cumpleaños de la persona está cerca dentro de los 7 días cuando se ejecuta el programa. – quartaela

1

rellenar una estructura tm con la fecha de nacimiento y convertir eso a un time_t.

Obtiene el time_t actual usando time().

Una semana es 86400 * 7 segundos.

Compruebe la diferencia entre la fecha de nacimiento time_t y la hora actual_t.

+0

entonces, ¿cómo puedo convertir la cadena por ejemplo "2010-11-10" en una variable time_t para comparar la fecha actual? y también me leen la cadena de cumpleaños de una persona de un archivo. – quartaela

2

desea que la función strptime para convertir la cadena en un struct tm. Es parte de Posix, pero no del estándar C. http://www.cs.potsdam.edu/cgi-bin/man/man2html?3+strptime tiene un ejemplo de cómo usar strptime.

A continuación, desea agregar 7 al campo tm_mday, convertir el resultado a un time_t (con mktime), y luego compararlo con la hora actual (de time(NULL)), por lo que ver si la fecha de entrada está dentro de la próxima semana .

No es portable, de acuerdo con el estándar C, hacer aritmética en los valores time_t, por lo que debe modificar los campos struct tm en su lugar. Del mismo modo, debe hacer la comparación con la hora actual usando difftime.

3

El siguiente programa de ejemplo convierte una cadena dada en la línea del argumento en el número de días. Ejemplo de salida:

% ./nd 2011-06-18 1971-02-10 invalid 2010invalid 
38 days 
-14699 days 
2147483647 days 
2147483647 days 

Editar: Decidió que -1 no es un indicador de fallo agradable así que usar INX_MAX su lugar.

#include <sys/param.h> 
#include <time.h> 
#include <string.h> 
#include <stdio.h> 

#define ONE_DAY (24 * 3600) 

int main(int argc, char *argv[]) 
{ 
     int i; 

     if(argc < 2) 
       return (64); // EX_USAGE 

     for(i=1; i < argc; i++) 
     { 
       time_t res; 

       res = num_days(argv[i]); 
       printf("%d days\n", res); 
     } 

     return(0); 
} 

int num_days(const char *date) 
{ 
     time_t now = time(NULL); 
     struct tm tmp; 
     double res; 

     memset(&tmp, 0, sizeof(struct tm)); 
     if(strptime(date, "%F", &tmp) == NULL) 
       return INT_MAX; 

     res = difftime(mktime(&tmp), now); 
     return (int)(res/ONE_DAY); 
} 
+0

amigo qué has hecho: D. qué es la biblioteca "#include " nunca la había usado. y por qué usamos memset_ ?. intento "2010-11-25" convertir esta cadena en una variable time_h y comparar el resultado con ahora. por lo que si el resultado es menor o igual que 7 que la salida será "su cumpleaños es en cerca de 7 días" y lo que "int main (int argc, char * argv []) { int i; si (argc <2) return (64); // EX_USAGE " ¿es este un mecanismo de control para la ejecución del programa_? – quartaela

+0

sys/param.h contiene parámetros para el sistema.Entre otros, define INT_MAX, que es el valor máximo que puede guardar un tipo entero. También define, por ejemplo, MAXPATHLEN, que es la longitud máxima que puede tener una ruta. Y sí, si el resultado de num_days es> 0 y <= 7, entonces puede decir "¡El usuario cumple años dentro de una semana!" Oh y yo usamos memset, porque strptime solo llena partes de struct tm que están especificadas en la cadena de formato, así que memset se asegura de que las partes indefinidas ahora estén definidas a 0. – Mel

+0

así solo copio y pego el código para probar y da un error que dice "newfile.c: 37: 40: warning: comparación entre puntero y entero" para la línea "if (strptime (date,"% F ", & tmp) == NULL)" _ ?. – quartaela