Come una persona diversa ha sottolineato, la soluzione vincente è davvero facile da capire ma presenta un problema. Richiede più tempo per l'esecuzione poiché la distanza tra le due date confrontate diventa più lunga. È un brutto problema.
Il codice riportato di seguito è probabilmente quasi semplice da comprendere, ma richiede all'incirca lo stesso tempo di esecuzione indipendentemente dal numero di giorni tra le due date. Si avvale del fatto che ogni settimana intera di 7 giorni avrà 5 giorni lavorativi in essa.
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
Per essere chiari, questo metodo conta il numero di giorni escludendo la data di scadenza modo che per esempio:
- 0 = numero di giorni tra Lunedi e Lunedi
- 1 = numero di giorni tra venerdì e sabato
- 1 = numero di giorni della settimana tra venerdì e lunedì
- 0 = numero di giorni della settimana tra domenica e lunedì
- 1 = numero di giorni feriali tra Mercoledì e Giovedi
fonte
2015-12-08 17:33:00
Vorrei pensare ad alcuni modi per farlo, ma dovresti dire quale comportamento desideri quando il "giorno di riferimento" è un giorno non lavorativo (È sabato-> lunedì 0 giorno o 1 giorno? Giovedì-> sabato 1 o 2 giorni?) – Tipx