Calcular Diferencia de Fechas

Iniciado por barbara87, 28 Noviembre 2007, 22:08 PM

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

barbara87

Hola soy barbara, soy nueva en el foro y la verdad estoy saturadisima con un programa que tengo q entregar antes del viernes.
Lo que me esta faltando es calcular la diferecia de dias que hay entre una fecha cualquiera, y la actual.

se como sacar la fecha actual con la funcion localtime, todo en estructuras, pero no se como implementar el difftime  - mktime.

la diferencia tiene que ser mayor a 4 dias....

jaja no se mucho de foros, pero por lo que vi hay gente que sabe bastante, espero que me puedan ayudar...



Flakito81

Si pusieras el código que tienes sería de gran ayuda para entender lo que tienes que hacer exactamente. Te dejo un código, que usa todas esas funciones a ver si te sirve de ayuda.

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

int main( void )
{
   int segundos;
   time_t *actualPtr, alarma;
   struct tm *alarmaPtr;
   segundos = 0;
   printf( "Introduzca los segundos: " );
   scanf( "%d", &segundos );
   
   *actualPtr = time( NULL );
   alarmaPtr = localtime( actualPtr );
   alarmaPtr->tm_sec += segundos;
   alarma = mktime( alarmaPtr );

   printf( "La hora local: %s\n", ctime(actualPtr) );

   while( difftime( alarma, *actualPtr ) > 0)
      *actualPtr = time( NULL );

   printf ("La hora local: %s\n", ctime(actualPtr));
   system ("pause");
   return 0;
}

Suerte!!

BETA_V

hola,,aca agrego otro codigo,,fijate estan implementadas algunas de las funciones que mencionabas,espero que te sea de ayuda

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
time_t dato1,dato2;//tienen que ser de la estructura time_t
dato1 = time(NULL);//sacas el tiempo en ese instante
int i=0;
printf(ctime(&dato1));//lo muestra bonito :)
while(i++<3000000000){
                      //perdemos un poco el tiempo
                  }
dato2= time(NULL);
printf(ctime(&dato2));
printf("pasaron %.f segundos",difftime(dato2,dato1));//esto te muestra la diferencia en segundos
system("pause");

return 0;
}

Arcangel2013

/*
  Name: Validar y calcular diferencia en dias
  Author: Luis Mora Morales
  Date: 15/02/12 22:20
*/

#include <iostream>
#include <stdlib.h>

using namespace std;

int dias[2];
int meses[2];
int años[2];
int i = 0; 

struct bmpFecha

{
       
unsigned short int dia:5;
unsigned short int mes:4;
unsigned short int anno:7;

}

fecha[2];
int diaMes[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

bool bisiesto (bmpFecha f);
bool validar (bmpFecha f);
void obtener_fecha();


char * mesLetra[] = { "Enero", "Febrero", "Marzo", "Abril", "Mayo",
    "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre",
    "Diciembre"};

int diasMes[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

struct stFecha{
    unsigned short int dia: 5; // Campo dia 5 bits; 32 valores
    unsigned short int mes: 4; // Campo mes 4 bits; 16 valores
    unsigned short int ano: 7; // Campo ano 7 bits; 128 valores 

    stFecha(){ almacenaFecha(1, 1, 1960); }
    stFecha(short d, short m, short a)
    {
        if( !almacenaFecha(d, m, a) )
            almacenaFecha(dias, meses, años);
    }
       
    bool almacenaFecha(short d, short m, short a)
    {   
        bool almacenar = false;
         
        if( validarFecha(&d, &m, &a) )
        {
            dia = d;
            mes = m;
            ano = a-1960;
           
            almacenar = true;
        }
       
        return almacenar;
    }
       
    void mostrarFecha()
    {
        cout.fill('0');
        cout.width(2);
        cout << dia << "/";
        cout.width(2);
        cout << mes << "/" << ano + 1960 << endl;
        cout.fill(' ');
    } 
       
    bool bisiesto()
    {
        bisiesto( ano );
    }
   
    bool validarFecha();
    int compararFechas( stFecha fecha2 );     
    int diferencia( stFecha fecha2 );
   
    private :
    bool bisiesto( int anno )
    {
        bool anoBisiesto = false;
     
        if( !((anno+1960)%4) && ( (anno+1960)%100 || !((anno+1960)%400) ) )
            anoBisiesto = true;
     
        return anoBisiesto;
    }
   
    bool validarFecha( short *d, short *m, short *a);
};
   



void comparar_fechas();
int diferencia;

int main()
{
    int subcidio;
    int ultimo;
    int penultimo;
    int antepenultimo;
    double total;
    char salir;
   
    do {
       
    obtener_fecha();
    i++;
    obtener_fecha();
    comparar_fechas();
   
   
   
    if(diferencia>3){
    subcidio=diferencia-3;
    cout << "Ingrese el salario del ultimo mes sin incapacidad : ";
    cin >> ultimo;
    cout << "Ingrese el salario del penultimo mes sin incapacidad : ";
    cin >> penultimo;
    cout << "Ingrese el salario del antepenultimo mes sin incapacidad : ";
    cin >> antepenultimo;
    total=((ultimo+penultimo+antepenultimo)/3/30*subcidio)*0.60;
    cout << "El subsidio correspondiente al empleado es de : " << total;
    }
    else cout << "No le corresponde ningun subsidio por incapacidad ";
    cout << endl << endl;
    system("pause");
    cout << "Desea realizar otro calculo S/N : ";
    cin >> salir;
    i=0;
}while(salir=='S' || salir=='s');
   return 0;
}

bool stFecha::validarFecha()
{
    bool fechaValida = false;
       
    if( mes >= 1 && mes <= 12 && ano <= 127 )
    {
        if( mes == 2 && bisiesto() )
        {
            if( dia >= 1 && dia <= 29 )
                fechaValida = true;
        }
        else
        {
            if( dia >= 1 && dia <= diasMes[mes-1] )
                fechaValida = true;
        }
    }
   
    return fechaValida;
}

int stFecha::compararFechas( stFecha fecha2 )
{
    int fechaPeso1, fechaPeso2, difPeso, resComp;
   
    // Convertimos las fechas en numeros con peso significativo
    fechaPeso1 = ano * 10000 + mes * 100 + dia;
    fechaPeso2 = fecha2.ano * 10000 + fecha2.mes * 100 + fecha2.dia;
   
    // Las restamos y comparamos la diferencia
    if( (difPeso = fechaPeso1 - fechaPeso2) > 0 )
        // La primera es mayor; 1
        resComp = 1;
    else
        if(difPeso < 0)
            // La segunda es mayor; -1
            resComp = -1;
        else
            // Son iguales; 0
            resComp = 0;

    return resComp;           
}       
       
int stFecha::diferencia( stFecha fecha2 )
{
    // Con vuestro permiso voy a usar punteros a las estructuras;
    // para referenciar correctamente a la menor y mayor fecha
    // y no crear mas estructuras en memoria
    stFecha *refFechMen, *refFechMay;
    int i, antBis;
    float acumDias;

    if( compararFechas( fecha2 ) > 0 )
    {   // Si compararFechas es cierto (mayor que cero); es decir 1
        // La primera fecha es mayor
        refFechMen = &fecha2;
        refFechMay = this;
    }
    else
    {   // Si compararFechas es falso (menor o igual que cero);
        // es decir 0 o -1
        // La segunda fecha es mayor o ambas son iguales.
        refFechMen = this;
        refFechMay = &fecha2;
    }
   
    // Calculo de los dias contenidos en años completos
    // Consideremos el año de la fecha menor como completo
    //---------------------------------------------------------------------
    // Buscamos el anterior bisiesto al año del fecha menor
    for( antBis = refFechMen->ano - 1; !bisiesto(antBis); antBis-- );
    // Calculamos la fracción de día erronea que llevamos a partir del año
    // bisiesto: 0, 0.25, 0.50 o 0.75
    acumDias = ((refFechMen->ano - antBis) * 0.25) - 0.25;
    // Acumulamos los años con su fraccion de dias erroneos
    acumDias += (refFechMay->ano - refFechMen->ano) * 365.25;

    // Acumulamos dias desde principio de año hasta la fecha mayor
    //---------------------------------------------------------------------   
    for( i = 1; i < refFechMay->mes; i++ )
        acumDias += diasMes[i-1];
   
    ( bisiesto(refFechMay->ano) && refFechMay->mes > 2 )?
        acumDias += refFechMay->dia  : acumDias += refFechMay->dia - 1;
   
    // Desacumulamos los dias desde principio de año hasta la fecha menor;
    // para quitar la diferencia de dias que hemos sumado de más
    // al considerar el primer año completo
    //---------------------------------------------------------------------   
    for( i = 1; i < refFechMen->mes; i++ )
        acumDias -= diasMes[i-1];
       
    ( bisiesto(refFechMen->ano) && refFechMen->mes > 2 )?   
        acumDias -= refFechMen->dia : acumDias -= refFechMen->dia - 1;
   
    // Finalmente retornamos acumulados despreciando la parte decimal
    //---------------------------------------------------------------------       
    return (int) acumDias;
}       

bool stFecha::validarFecha( short *d, short *m, short *a)
{
    bool fechaValida = false;
           
    if( *m >= 1 && *m <= 12
        && *a >= 1960 && *a <= 2087 )
    {
        if( *m == 2 && bisiesto((int) *a ))
        {
            if( *d >= 1 && *d <= 29 )
                fechaValida = true;
        }
        else
        {
            if( *d >= 1 && *d <= diasMes[*m-1] )
                fechaValida = true;
        }
    }
   
    return fechaValida;
}   


void obtener_fecha()
{   

int valido = 0;

while(valido != 1){

   
do{
system("cls");
if(i==0)
cout << "Ingrese la fecha de inicio de la incapacidad : " << endl << endl;
else cout << "Ingrese la fecha de fin de la incapacidad : " << endl << endl;

cout << "Introduzca el dia : ";

cin >> dias;


fecha.dia = dias;}while (dias > 31 || dias < 1);

do{
system("cls");

cout << "Introduzca el mes : ";

cin >> meses;

fecha.mes = meses;}while (meses > 12 || meses < 1);

do{
system("cls");

cout << "Introduzca el a\244o mayor a 1960 y menor a 2087 : ";

cin >> años;

fecha.anno = años - 1960;}while (años < 1960 || años > 2087 );

if (validar(fecha)){ cout << "\nFecha correcta" << endl << endl;
valido = 1;}

else {

cout << "\nFecha incorrecta" << endl << endl;
}

system("pause");

}// Fin del while
}


bool validar (bmpFecha f)
{

if (f.dia > diaMes[f.mes-1]) {

if ((f.mes == 2) && (f.dia == 29) && bisiesto(f)) return true;

else return false;

}

else return true;

}

bool bisiesto (bmpFecha f)
{

if (((f.anno + 1960) % 4 == 0) && ((f.anno + 1960) % 100 != 0))

return true;

else {

if ((f.anno + 1960) % 400 ==0) {

return true;

}

else return false;

}
}

void comparar_fechas()
{
     
        stFecha fechaPrueba1(dias[0],meses[0],años[0]);
        cout << "\nResultado de la validacion: "
        << fechaPrueba1.validarFecha() << endl; // y comprobamos si es valida
       
        fechaPrueba1.mostrarFecha(); cout << endl; // La mostramos

        stFecha fechaPrueba2(dias[1],meses[1],años[1]); // Creamos otra fecha
        cout << "\nResultado de la validacion: "
        << fechaPrueba2.validarFecha() << endl; // y comprobamos si es valida
   
        fechaPrueba2.mostrarFecha(); cout << endl; // La mostramos
   
   
   //Comparamos las fechas
   cout << "\nResultado de la comparacion: "
        << fechaPrueba1.compararFechas(fechaPrueba2) << endl;

   // Vemos la diferencia en dias entre las fechas anteriores       
   cout << "Resultado de la diferencia: "
        << fechaPrueba1.diferencia(fechaPrueba2) << endl << endl;
        diferencia=fechaPrueba1.diferencia(fechaPrueba2);

}

david_BS

#4
Este post, tiene una clase Fecha que tiene al final un par de funciones sobre algo así, aunque es para saber si una fecha está dentro de un dos fechas.

http://foro.elhacker.net/programacion_cc/clase_fecha_con_modificaciones-t358396.0.html

EDIT:
daaaaaaaaa mirá la fecha del tema quien se mandó el bump XD