2012-09-18 14 views
5

Quiero excluir el 29 de febrero de mis cálculos de no de días completos entre dos fechas. Excluyendo los valores de esquina del intervalo.Excluir 29 de febrero del intervalo de tiempo

escenarios de prueba:

1 March 2012 - 28th February 2012 = should give 0 days. 
1 March 2012 - 26th February 2012 = should give 2 days. 
1 March 2013 - 28th February 2012 = should give 365 days and not 366 days. 
1 March 2017 - 28th February 2012 = should give 365*5 =1825 days and not 1827 days. 

Actualmente me analizan años y comprobar si hay algún año bisiesto entre las fechas y luego verificar si el intervalo tiene 29o febrero. ¿Hay alguna manera de averiguar si un intervalo en particular tiene un día en particular y una cantidad de ocurrencias si el intervalo abarca varios años?

+1

Fuera de interés, ¿por qué quiere excluir el 29 de febrero? –

+2

@ peter-lawrey Estoy escribiendo un código para una compañía de seguros y tienen una política de no cobrar la prima el 29 de febrero en caso de que la póliza sea entregada o prorrateada. – Hulk

Respuesta

1

pero no es causado por el 29 de febrero, es correcto.

si compara 1 de marzo de 2012 y 28 de febrero de 2012 se devolverá 1 día, y con 29 se devolverá 2 días. La diferencia entre estas dos fechas es un día.

Para volver 0 días cómo desea usted debe comparar dos mismas fechas, tipo 1 de marzo de 2012 y el 1 de marzo de 2012.

Creo que estás confundiendo que ^^.

+0

Estoy hablando de días completos entre dos fechas excluyendo los extremos. Actualizaré la pregunta para mayor claridad. – Hulk

+0

humm, no sé si es posible, pero si cambias el año a 1900, por ejemplo, solo para comparar las dos fechas? – Cechinel

0

He oído hablar de 360 ​​días de días, pero esta es la primera vez que me encuentro con un año de 365 días.

Su mejor opción es calcular la diferencia entre sus fechas en días y restar todos los 29 de febrero que encuentre.

Lo que significa que necesita una rutina que pasará por su rango de fechas y devolverá un recuento del número de 29 de febrero que se encuentre.

no tengo ni idea de cómo hacer esto en JodaTime, pero el algoritmo básico sería

  • convertir la fecha de inicio para el número de días desde el 1 de enero de 1970.
  • Convertir la fecha de finalización de la número de días desde el 1 de enero de 1970.
  • Loop desde el día de inicio hasta el final un día a la vez.
  • Convertir día de bucle de nuevo a una fecha.
  • si la fecha es 29 feb, agregue 1 a un contador
  • Después de terminar el ciclo, devuelva el contador.
0

uso de JavaScript puede acheive de la siguiente manera, donde startDateendDate y son javascript Date objetos.

function calculateDays(startDate,endDate){ 
    var oneDay = 86400000; //ms per day 
    var difference = Math.ceil((endDate.getTime() - startDate.getTime())/oneDay); 
    var totFeb29s = findTotalFeb29s(startDate,endDate); 
    return parseInt(difference)+parseInt(1)-parseInt(totFeb29s);  
}  
function findTotalFeb29s(startDate,endDate){ 
    var totalFeb29s = 0; 
    var startYear = startDate.getFullYear(); 
    var endYear = endDate.getFullYear(); 
    for(var year=startYear;year<=endYear;year++){ 
     var dt = new Date(year, 1, 29); 
     var isLeap = dt.getMonth() == 1; 
     if(isLeap==true && startDate<=dt && dt<=endDate){ 
      totalFeb29s = parseInt(totalFeb29s)+parseInt(1); 
     } 
    } 
    return totalFeb29s; 
}  
+0

¿por qué proporciona una respuesta de javascript?la pregunta no pregunta por esto. –

1

El siguiente pseudo-código Java-esque debería funcionar. También le permitirá agregar otros filtros si lo desea:

int daysExcludingLeapYearDay(Date start, Date end) 
{ 
    if(end.isBefore(start)) 
    { 
     return filterOutLeapYearDays(daysBetween(end, start)).size(); 
    } 

    return filterOutLeapYearDays(daysBetween(start, end)).size(); 
} 

List<Date> filterOutLeapYearDays(List<Date> days) 
{ 
    List<Date> daysExcludingLeapYearDays = 
      days 
      .filter(d -> !isFeb29(d)) 
      .toList()); 

    return daysExcludingLeapYearDays; 
} 

List<Date> daysBetween(Date start, Date end) 
{ 
    List<Date> days = new List(); 

    for (Date day = start; day.isBefore(end); day = day.plusOneDay()) 
    { 
     days.add(day); 
    } 

    return days 
} 

boolean isFeb29(Date date) 
{ 
    return date.month == FEBRUARY && date.day == 29; 
} 
Cuestiones relacionadas