Cita:
Iniciado por vangodp tenga en cuenta que ni todos los meses tienen 28 días. El calculo es aproximado y puede fallar. Aun así no conozco nada más compacto.
Se puede conseguir un cálculo sin error con un par de cambios:
Código C:
Ver originalint comparar(struct Fecha fechaDada, struct Fecha fechaInicio, struct Fecha fechaFin)
{
unsigned long fecha = fechaDada.anio * 10000 + (fechaDada.mes * 100) + fechaDada.dia;
unsigned long inicio = fechaInicio.anio * 10000 + (fechaInicio.mes * 100) + fechaInicio.dia;
unsigned long fin = fechaFin.anio * 10000 + (fechaFin.mes * 100) + fechaFin.dia;
if ( fecha >= inicio && fecha <= fin )
{
return 1;
}else{
return 0;
}
}
Claro que también puedes pasarlo a una estructura tm y comparar:
Código C:
Ver originaltime_t FechaToTime( struct Fecha* fecha )
{
struct tm info;
info.tm_sec = 0;
info.tm_min = 0;
info.tm_hour = 0;
info.tm_mday = fecha->dia;
info.tm_mon = fecha->mes - 1;
info.tm_year = fecha->anio - 1900;
info.tm_isdst = -1;
}
int comparar(struct Fecha fechaDada, struct Fecha fechaInicio, struct Fecha fechaFin)
{
time_t fecha = FechaToTime( &fechaDada );
time_t inicio = FechaToTime( &fechaInicio );
time_t fin = FechaToTime( &fechaFin );
if ( fecha >= inicio && fecha <= fin )
{
return 1;
}else{
return 0;
}
}
Y luego, como tercera opción, siempre puedes hacer las comparaciones "a pelo":
Código C:
Ver original// el return puede ser:
// == 0 -> Las dos fechas son iguales
// > 0 -> fecha1 > fecha2
// < 0 -> fecha1 < fecha2
int comparar2Fechas( struct Fecha* fecha1, struct Fecha* fecha2 )
{
int to_return = fecha1->anio - fecha2->anio;
if( to_return == 0 )
to_return = fecha1->mes - fecha2->mes;
if( to_return == 0 )
to_return = fecha1->dia - fecha2->dia;
return to_return;
}
int comparar(struct Fecha fechaDada, struct Fecha fechaInicio, struct Fecha fechaFin)
{
int to_return = 0;
if( comparar2Fechas( &fechaDada, &fechaInicio ) >= 0 )
{
if( comparar2Fechas( &fechaDada, &fechaFin ) <= 0 )
to_return = 1;
}
return to_return;
}
Será por falta de alternativas :)
Un saludo