Ver Mensaje Individual
  #7  
Antiguo 07-08-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 14
aguml Va por buen camino
amigos al final hice funcionar esto ya que el problema que me daba era que los archivos eran time64.h y time64.c y por lo visto al colocar el #include "time64.h" buscaba el time64.cpp y le cambié la extension y listo.
Ahora tengo otro problema que creo que es cosa de mi codigo, las cuentas no me salen.
Os pongo las dos funciones encargadas del calculo de diferencia entre fechas a ver si veis el fallo porque yo ya no se que hacer.
Código:
int GetNDaysMonth(int mes, int anio)
{
    int dias;

        switch (mes)
        {
                case 1: case 3: case 5: case 7: case 8: case 10: case 12:
                        dias = 31;
                        break;
                case 4: case 6: case 9: case 11:
                        dias = 30;
                        break;
                case 2:if(anio%4==0)
                                dias = 28;
                    else
                                dias=29;
                        break;
                default:
                        ShowMessage("El mes no es válido.");
                        break;
        }
        return dias;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button_CalcularClick(TObject *Sender)
{
        t64 now, time1, time2;
        struct tm aux, newyear1, newyear2, superior, inferior;
        double segundos = 0, minutos = 0, horas = 0, dias = 0,meses = 0, anios = 0, timeAux;
        int nDias;
        bool error = false;

        if(MaskEdit_Fecha1->Text.Length() != 10)
        {
                ShowMessage("Primera fecha tiene un formato de fecha inválido.\nFormato válido '00/00/0000'");
        }
        else if(RadioGroup_Tipo->ItemIndex == 0 && MaskEdit_Fecha2->Text.Length() != 10)
        {
                ShowMessage("Segunda fecha tiene un formato de fecha inválido.\nFormato válido '00/00/0000'");
        }
        else
        {
                time(&now);  //Obtengo el tiempo condensado en segundos. Creo que aqui tendria problemas porque no es de 64 bits
                aux = *localtime(&now);
                aux.tm_hour = 0;
                aux.tm_min = 0;
                aux.tm_sec = 0;
                aux.tm_wday = 0;
                aux.tm_yday = 0;
                now = mktime64(&aux);

                newyear1 = *localtime(&now);
                newyear1.tm_year = MaskEdit_Fecha1->Text.SubString(7,4).ToInt() - 1900;
                newyear1.tm_mon = MaskEdit_Fecha1->Text.SubString(4,2).ToInt() - 1;
                newyear1.tm_mday = MaskEdit_Fecha1->Text.SubString(1,2).ToInt();
                newyear1.tm_hour = aux.tm_hour;
                newyear1.tm_min = aux.tm_min;
                newyear1.tm_sec = aux.tm_sec;
                newyear1.tm_wday = 0;
                newyear1.tm_yday = 0;

                if(RadioGroup_Tipo->ItemIndex == 0)
                {
                        newyear2 = newyear1;
                        newyear2.tm_year = MaskEdit_Fecha2->Text.SubString(7,4).ToInt() - 1900;
                        newyear2.tm_mon = MaskEdit_Fecha2->Text.SubString(4,2).ToInt() - 1;
                        newyear2.tm_mday = MaskEdit_Fecha2->Text.SubString(1,2).ToInt();

                        time1 = mktime64(&newyear1);
                        if(time1 == -1)
                        {
                                ShowMessage("Primera fecha no es correcta.");
                                error = true;
                        }
                        time2 = mktime64(&newyear2);
                        if(time2 == -1)
                        {
                                ShowMessage("Segunda fecha no es correcta.");
                                error = true;
                        }
                }else{
                        time1 = mktime64(&newyear1);
                        if(time1 == -1)
                        {
                                ShowMessage("Primera fecha no es correcta.");
                                error = true;
                        }
                        time2 = now;
                }

                if(!error)
                {
                        if(time1 > time2)
                        {
                                segundos = difftime(time1,time2);
                                superior = *localtime(&time1);
                                inferior = *localtime(&time2);
                        }
                        else
                        {
                                segundos = difftime(time2,time1);
                                superior = *localtime(&time2);
                                inferior = *localtime(&time1);
                        }

                        minutos = segundos / 60;
                        timeAux = segundos;
                        segundos = fmod(timeAux,60);

                        horas = minutos / 60;
                        timeAux = minutos;
                        minutos = fmod(timeAux,60);

                        dias = horas / 24;
                        timeAux = horas;
                        horas = fmod(timeAux,24);

                        nDias = GetNDaysMonth((inferior.tm_mon+1), (inferior.tm_year + 1900));

                        while(nDias <= dias)
                        {
                                if(inferior.tm_year <= superior.tm_year)
                                {
                                        dias -= nDias;
                                        nDias = GetNDaysMonth((inferior.tm_mon+1), (inferior.tm_year + 1900));

                                        if(inferior.tm_mon == 11)
                                        {
                                                inferior.tm_mon = 0;
                                                inferior.tm_year++;
                                                meses++;
                                        }
                                        else
                                        {
                                                inferior.tm_mon += 1;
                                                meses++;
                                        }

                                        if(meses == 12)
                                        {
                                                anios++;
                                                meses = 0;
                                        }
                                }
                        }

                        ShowMessage (AnsiString(anios)+" años\n" +
                                     AnsiString(meses)+" meses\n" +
                                     AnsiString(dias)+" dias");
                }
        }
}
//---------------------------------------------------------------------------
Os cuento el problema:
Si pongo como primera fecha 07/08/2014 y como segunda 07/08/2015, me dirá que han pasado 0 años, 11 meses y 29 dias. Deberia de devolver 1 año, 0 meses, 0 dias.
Si pongo como primera fecha 07/08/2014 y como segunda 07/08/2514 me dice que la diferencia es de 499 años, 3 meses, y 21 dias cuando creo que tendria que devolver 500 años.
Creo que el fallo está en lo que hago para calcular los dias, meses y años pero no veo el fallo.
A ver si podeis ayudarme en esto que llevo meses liado y no lo termino.
Si quereis los fuentes me lo decis y os los mando.
Responder Con Cita