elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Calcular Diferencia de Fechas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Calcular Diferencia de Fechas  (Leído 11,201 veces)
barbara87

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Calcular Diferencia de Fechas
« en: 28 Noviembre 2007, 22:08 pm »

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...




En línea

Flakito81


Desconectado Desconectado

Mensajes: 519



Ver Perfil
Re: Calcular Diferencia de Fechas
« Respuesta #1 en: 29 Noviembre 2007, 01:57 am »

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.
Código:
#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!!


En línea

BETA_V

Desconectado Desconectado

Mensajes: 131


HC


Ver Perfil
Re: Calcular Diferencia de Fechas
« Respuesta #2 en: 29 Noviembre 2007, 03:43 am »

hola,,aca agrego otro codigo,,fijate estan implementadas algunas de las funciones que mencionabas,espero que te sea de ayuda
Código
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdlib.h>
  4. int main(void)
  5. {
  6. time_t dato1,dato2;//tienen que ser de la estructura time_t
  7. dato1 = time(NULL);//sacas el tiempo en ese instante
  8. int i=0;
  9. printf(ctime(&dato1));//lo muestra bonito :)
  10. while(i++<3000000000){
  11.                      //perdemos un poco el tiempo
  12.                  }
  13. dato2= time(NULL);
  14. printf(ctime(&dato2));
  15. printf("pasaron %.f segundos",difftime(dato2,dato1));//esto te muestra la diferencia en segundos
  16. system("pause");
  17.  
  18. return 0;
  19. }
  20.  
En línea

Arcangel2013

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Re: Calcular Diferencia de Fechas
« Respuesta #3 en: 8 Junio 2012, 04:18 am »

/*
  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);

}
En línea

david_BS

Desconectado Desconectado

Mensajes: 99



Ver Perfil WWW
Re: Calcular Diferencia de Fechas
« Respuesta #4 en: 16 Junio 2012, 17:17 pm »

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
« Última modificación: 16 Junio 2012, 17:18 pm por david_BS » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Calcular % con fechas
Programación Visual Basic
Mr.Chispa 2 1,607 Último mensaje 6 Septiembre 2006, 09:05 am
por Mr.Chispa
Calcular días entre dos fechas...
Ejercicios
*-.Sub-Vorbio.-* 0 4,853 Último mensaje 13 Noviembre 2008, 00:51 am
por *-.Sub-Vorbio.-*
Calcular numero de días entre dos fechas!
Java
*-.Sub-Vorbio.-* 9 39,583 Último mensaje 26 Marzo 2009, 23:34 pm
por Choclito
Programas para calcular fechas
Programación C/C++
NicolasPileci 9 3,756 Último mensaje 24 Mayo 2017, 22:49 pm
por MAFUS
[Resuelto] ¿Existe librería para calcular el tiempo pasado entre dos fechas?
PHP
Leguim 1 2,353 Último mensaje 7 Febrero 2020, 16:19 pm
por EdePC
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines