Comparando fechas en C con (usando la biblioteca time.h)

hola puedo comparar cumpleaños de personas en formato AAAA-MM-DD con funciones de 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é en la biblioteca "time.h" pero no pude administrarla. Aprecio si puedes ayudar.

preguntado el 10 de mayo de 11 a las 13:05

4 Respuestas

yo usaría difftime al time_t valores y comparar con el número de segundos en una semana ...

contestado el 10 de mayo de 11 a las 17:05

entonces, ¿cómo puedo convertir la cadena, por ejemplo, "2010-11-10" en una variable time_t para comparar la fecha de hoy. y también leo la cadena de cumpleaños de la persona desde un archivo - Quartaela

Puede cargar los valores en los campos de un struct tm Y luego usar mktime conseguir un time_t valor. Solo asegúrese de que todos los campos no utilizados estén borrados a 0. - R .. GitHub DEJA DE AYUDAR A ICE

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

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

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

Editar: Decidí que -1 no es un buen indicador de falla, así que usa INX_MAX en 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);
}

contestado el 10 de mayo de 11 a las 19:05

amigo, ¿qué has hecho? D. qué es la biblioteca "#include "Nunca lo 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. Entonces, si el resultado es menor o igual que 7 que el resultado will "su cumpleaños es en casi 7 días" y qué "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

sys / param.h contiene parámetros para system. Entre otros, define INT_MAX, que es el valor máximo que puede mantener 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 núm_días es> 0 y <= 7, entonces puede decir "¡El usuario cumple años dentro de una semana!" Ah, y uso memset, porque strptime solo llena partes de struct tm que se especifican en la cadena de formato, por lo que memset se asegura de que las partes indefinidas ahora estén definidas en 0. - miel

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

O no incluiste o en su sistema time.h no está definido en time.h. Consulte la página de manual de strptime en su sistema. - miel

int main () {char buff [11]; char nacimiento [11] = "2011-05-15"; int res; time_t ahora = hora (NULL); strftime (buff, 20, "% Y-% m-% d \ n", localtime (y ahora)); res = difftime (mktime (nacimiento), ahora); printf ("% d", res); return 0; } Bueno, con este código puedo comparar las cadenas "buff" y "nacimiento". buff obtiene la hora actual como una cadena. Puedo administrar esta parte, pero la variable res siempre muestra 0. - Quartaela

Quiere que el strptime función 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.

Luego desea agregar 7 al tm_mday campo, convierta el resultado en un time_t (con mktime), y luego compárelo con la hora actual (desde time(NULL)), así que vea si la fecha de entrada es dentro de la próxima semana.

No es portátil, según el estándar C, para hacer aritmética en time_t valores, por lo que debe modificar el struct tm campos en su lugar. Del mismo modo, debe hacer la comparación con la hora actual utilizando difftime.

contestado el 10 de mayo de 11 a las 19:05

Complete una estructura tm con la fecha de nacimiento y conviértala en time_t.

Obtenga el time_t actual usando time ().

Una semana son 86400 * 7 segundos.

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

contestado el 10 de mayo de 11 a las 17:05

Entonces, ¿cómo puedo convertir la cadena, por ejemplo, "2010-11-10" en una variable time_t para comparar la fecha de hoy? y también leo la cadena de cumpleaños de la persona de un archivo. - Quartaela

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.