Como señaló una persona diferente, la solución ganadora es realmente fácil de entender, pero tiene un problema. Se tarda más tiempo en ejecutarse a medida que la distancia entre las dos fechas que se comparan se hace más larga. Ese es un problema feo.
El código siguiente es, con suerte, casi tan simple de entender, pero lleva aproximadamente la misma cantidad de tiempo de ejecución, independientemente del número de días entre las dos fechas. Aprovecha el hecho de que cada semana completa de 7 días tendrá 5 días hábiles.
require 'date'
def weekdays_between(earlier_date,later_date)
days_diff = (later_date - earlier_date).to_i
weekdays = 0
if days_diff >= 7
whole_weeks = (days_diff/7).to_i
later_date -= whole_weeks*7
weekdays += whole_weeks*5
end
if later_date > earlier_date
dates_between = earlier_date..(later_date-1)
weekdays += dates_between.count{|d| ![0,6].include?(d.wday)}
end
return weekdays
end
Para ser claros, este método cuenta el número de días de la semana con exclusión de la fecha de finalización de modo que por ejemplo:
- 0 = número de días de semana entre Lunes y Lunes
- 1 = número de días de la semana entre el viernes y sábado
- 1 = número de días de la semana entre el viernes y el lunes
- 0 = número de días laborables entre domingo y lunes
- 1 = Número de días laborables entre miércoles y jueves
Pensaría en algunas formas de hacerlo, pero debe decir qué comportamiento desea cuando el "día de referencia" no sea un día hábil (¿Es sábado-> lunes 0 día o 1 día? ¿Es jueves-> sábado 1 o 2 días?) – Tipx