Suponiendo que tenemos 2 fechas definidas como:
struct date fechaInicial; struct date fechaFinal; |
Queremos halla el numeo de dias entre fechaInicial y fechaFinal, bien la cabecera y funciones clave de nuestro programas serían:
#include <stdio.h> #include <dos.h> #include <conio.h>
#define dias_por_400_anios (365*400+100-3) #define es_anio_bisiesto(y) ((((y)%400)==0)||((((y)%4)==0)&&(((y)%100)!=0)))
enum bool { false = 0, true = 1 };
enum Mes { Enero = 1, Febrero = 2, Marzo = 3, Abril = 4, Mayo = 5, Junio = 6, Julio = 7, Agosto = 8, Septiembre = 9, Octubre = 10, Noviembre = 11, Diciembre = 12 };
long dias_pasados_400_anios(int y) { return ( y > 0 ) ? 365 * y + (y-1) / 4 - (y-1) / 100 + 1 : 0; }
long dias_pasados_mes (int y, int m) { const int dias[12] = { 0, 31, 31+28, 59+31, 90+30, 120+31, 151+30, 181+31, 212+31, 243+30, 273+31, 304+30 /*, 334+31 = 365*/ };
long resultado;
resultado = dias[m-1];
if ( m > Febrero && es_anio_bisiesto ( y ) ) resultado++;
return resultado; }
long dias_pasados_fecha (struct date fecha) { long dias; dias = (fecha.da_year/400) * dias_por_400_anios + dias_pasados_400_anios ( fecha.da_year % 400 ) + dias_pasados_mes ( fecha.da_year, fecha.da_mon ) + fecha.da_day;
return dias; }
long numero_dias (struct date fechaInicial, struct date fechaFinal) { return dias_pasados_fecha(fechaFinal) - dias_pasados_fecha(fechaInicial); } |
La función definida como numero_dias, devuelve el numero de dias entre 2 fechas pasadas como parametros.
Ahora un pequeño programita para verificar si funciona todo esto:
void main() { struct date fechaInicial, fechaFinal;
fechaInicial.da_day=1; fechaInicial.da_mon=6; fechaInicial.da_year=2006;
fechaFinal.da_day=15; fechaFinal.da_mon=7; fechaFinal.da_year=2006;
clrscr();
printf("El numero de dias entre las 2 fechas es: %ld", numero_dias(fechaInicial, fechaFinal));
getch(); } |
Fíjense en lo fácil que resulta determinar si la fecha está en el intervalo especificado, gracias a la función que definimos
|