Consultoría Informática: Programas a medida, Páginas web, Tiendas Online, Posicionamiento en Internet (SEO), Accesibilidad, Usabilidad...

Función para calcular los días que hay entre dos fechas

WebProgramacion > Recursos sobre informática y tecnología > Programacion > PASCAL > Función para calcular los días que hay entre dos fechas
Autor: José Luis Álvarez

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

FUNCTION CUENTA_DIAS(fecha_p, fecha_d : STRING[10]):LONGINT;

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 }

Podría interesarte...

Función para evaluar si un año es bisiesto
Función en Pascal que recibe como parámetro un año y nos indica si éste es bisiesto o no