La siguiente funcion hace uso de la funcion ano_bisiesto. Cuenta los dias entre dos fechas que son pasadas como parámetros.
Las fechas deben ser de tipo string y con el formato xx:yy:zzzz donde xx es el dia; yy el mes y zzzz el año.
Importante: la fecha_p debe ser mayor que la fecha_d
VAR
contador : LONGINT;
cad1, cad2, cad3 : STRING;
ano_p, mes_p, dia_p, ano_d, mes_d, dia_d, codigo : INTEGER;
BEGIN
cad1:=COPY(fecha_p, 1, 2); VAL(cad1, dia_p, codigo);//paso dias a numero
cad2:=COPY(fecha_p, 4, 2); VAL(cad2, mes_p, codigo);//paso mes a numero
cad3:=COPY(fecha_p, 7, 4); VAL(cad3, ano_p, codigo);//idem para el año
cad1:=COPY(fecha_d, 1, 2); VAL(cad1, dia_d, codigo);//idem para fecha_d
cad2:=COPY(fecha_d, 4, 2); VAL(cad2, mes_d, codigo);
cad3:=COPY(fecha_d, 7, 4); VAL(cad3, ano_d, codigo);
contador:=0;
WHILE (ano_d <> ano_p) OR (mes_d <> mes_p) OR (dia_d <> dia_p) DO
BEGIN
WHILE (mes_d <> mes_p) OR (dia_d <> dia_p) DO
BEGIN
DEC(dia_d); INC(contador); //para que entre en el siguiente bucle
WHILE (dia_d <> dia_p) DO
BEGIN
IF dia_d <> 0 THEN BEGIN DEC(dia_d); INC(contador); END;
IF dia_d = 0 THEN BREAK;
END;
IF dia_d = 0 THEN
BEGIN
CASE mes_d OF
1 : BEGIN mes_d:=12; dia_d:=31; DEC(ano_d); END;
3 : BEGIN mes_d:=2;
IF ANO_BISIESTO(ano_d) = TRUE THEN dia_d:=29
ELSE dia_d:=28;
END;
5 : BEGIN mes_d:=4; dia_d:=30; END;
7 : BEGIN mes_d:=6; dia_d:=30; END;
10 : BEGIN mes_d:=9; dia_d:=30; END;
12 : BEGIN mes_d:=11; dia_d:=30; END
ELSE
BEGIN
DEC(mes_d); dia_d:=31;
END;
END; {case}
END; {if}
END; {while mes}
{cuando llegue aqui coincide mes y dia}
{ahora sumamos 365 o 366 segun corresponda}
WHILE (ano_d <> ano_p) DO
BEGIN
IF ANO_BISIESTO(ano_d – 1) = TRUE THEN contador:=contador + 366
ELSE contador:=contador + 365;
DEC(ano_d);
END;
END; {while ano}
CUENTA_DIAS:=contador;
END; { FIN CUENTA_DIAS }