Lo que complica las fechas son los años bisiestos. Anulado dicho efecto, es un problema mucho más sencillo de tratar...
Yo tendría una enumeración en la forma:
enumeracion DiasHastaMes
dEnero = 1
dFebrero = dEnero + 31
dMarzo = dFebrero + 28
dAbril = dMarzo + 31
...
dDiciembre = dNoviembre + 30
dAño = dDiciembre + 31
Fin enum
Es decir cada mes valdría el día absoluto del año. Y equivaldría al día 1 de dicho mes (nótese que puede considerarse el día 1 consumido o sin consumir, bastando cambiar para enero el valor 1 ó 0 según convenga cuando se adelante el bosquejo y se pase al código).
Por supuesto se mantiene la enumeración de meses... y pasaría los datos a un array. Nótese igualmente el 'AÑO'...
Enumeracion MesesDelAño
ENERO = 1
FEBRERO = 2
...
DICIEMBRE = 12
AÑO = 13
fin enumeracion
array DiasHastaMes Mes(1 a 13)
Mes(ENERO) = dEnero
Mes(FEBRERO) = dFebrero
...
Mes(DICIEMBRE) = dDiciembre
Mes(AÑO) = dAño
Me 'inventaría el mes 13' que es el 'año completo' que tendrá 365.
Desde esta perspectiva basta:
1 - Contar el año inicial incompleto (si lo es)
2 - Contar años completos (si los hay).
3 - Contar el año final incompleto (si lo es).
Ahora el problema se fragmentado en 3 partes, la más sencilla de calcular es la segunda...
Funcion CalcularIntervalosEntre2Fechas(fecha-string FechaInicial, FechaFinal)
entero DiaInicial, DiaFinal, AñoInicial, AñoFinal
MesesDelAño MesInicial, MesFinal
entero dias, meses, años
// La fecha inicial recibida se separa en año, mes y dia
llamada a la funcion SepararFecha(FechaInicial, AñoInicial, MesInicial, DiaInicial)
// Idem con la fecha final.
llamada a la funcion SepararFecha(FechaFinal, AñoFinal, MesFinal, DiaFinal)
// 1 --- contar año inicial incompleto:
Si ((MesInicial> 1) o (DiaInicial >1) ) // Esto es si: (fechaInicial > "1 de enero")
dias = dAño - (mes(MesInicial+1) - DiaInicial))
meses = (12 - MesInicial)
// años = 0
AñoInicial + = 1
fin si
// 3 ---- contar año final incompleto.
si ((MesFinal < 12) o (Dia < 31)) // Esto es si: (Fechafinal < "31 diciembre")
dias += mes(MesFinal) + diaFinal
meses += Mesfinal
añoFinal -=1
fin si
// 2 ---- Contar años completos.
Si añoFinal <= añoInicial)
años = (añoFinal - añoInicial)
sino
años = 0
fin si
meses + = (años * 12)
dias += (años * dAño) // * 365
imprimir dias, meses, años
Fin funcion
La función 'SepararFecha', es una función que separa la fecha según el formato de entrada en sendos parametros que devuelve por referencia... es superfluo definir una función así, queda a tu esfuerzo.
Nótese que en meses y años solo se cuentan como tales los que sean completos...
y noteses que como está hecho al vuelo, puede precisar algún ajuste del tipo +1, -1 en alguna parte...