![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
|||
|
|||
|
Buenas voy a colocal un link de un sitio donde consegui algo para calculos de fechac y me ha funcionado al pelo, no tengo nada que ver con ese sitio solo que tiene buena informacion gratuita con relacion a delphi
descargar el ejemplo de aqui alli contiene el codigo |
|
#2
|
||||
|
||||
|
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");
}
}
}
//---------------------------------------------------------------------------
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. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Uso de DBE Alternativa? | thelibmx | Varios | 3 | 08-10-2010 20:28:06 |
| Alternativa a Locate | totote | Conexión con bases de datos | 3 | 14-04-2009 18:18:31 |
| ¿Una alternativa a win98? | FGarcia | Windows | 3 | 16-06-2008 08:39:44 |
| Alternativa OutLook | Io | Varios | 4 | 26-12-2007 11:08:19 |
| Alternativa SQL*Plus | Alfonsoft | Oracle | 4 | 07-10-2007 17:31:14 |
|