Una delle cose più complicate è questa
'2016-05-06'
era 4 giorni lavorativi dopo '2016-05-02'
, ma
'2016-05-10'
era 2 giorni lavorativi dopo '2016-05-06'
,
anche se in entrambe le coppie di date corrisponde esattamente lo stesso numero totale di giorni trascorsi.
Quindi, quello che probabilmente farei per ottenere il numero di giorni lavorativi tra la data A
e data B (supponendo che "giorno lavorativo" significhi "qualsiasi giorno che non sia un"
Sabato o domenica")
sarebbe di scegliere una "data zero", qualche domenica prima di qualsiasi data
Vorrei sempre utilizzare come data A, trovare il numero di giorni lavorativi tra
la data zero e la data B, quindi sottrarre il numero di
giorni lavorativi tra la data zero e la data A.
(Naturalmente questo è tutto per una certa definizione di "tra".
Per altre definizioni potrei usare un lunedì come data zero,
oppure usa il lunedì con la data A e la domenica con la data B, o viceversa,
qualunque cosa abbia dato risultati che corrispondono alla definizione desiderata.)
Un modo per trovare il numero di giorni lavorativi tra
una domenica a zero date e la data X devono prendere il numero totale di giorni
tra quelle date e sottrarre il numero di sabato e domenica.
Per questo potremmo usare quello che molti chiamano "divisione intera".
Diversi linguaggi di programmazione ti offrono diversi modi per indicare
che vuoi dividere un intero x
con un altro intero y
mentre scartando il resto. Scriverò questa operazione x // y
ai fini di questa risposta; sostituire la forma corretta in qualsiasi modo
lingua che usi.
Lascia che il valore intero x
sia il numero totale di giorni tra il
data zero (una domenica) e data X.
Quindi il numero di domeniche tra la data zero e la data X è x // 7
,
e il numero di sabato è (x + 1) // 7
.
Il numero di giorni lavorativi è
f(x) = x - (x // 7) - ((x + 1) // 7)
Si noti che la divisione integer non segue le stesse leggi distributive
come la divisione in virgola mobile (quasi);
x - ((2*x + 1) // 7)
produrrebbe molte risposte sbagliate.
Il numero di giorni lavorativi tra la data A e la data B, che sono rispettivamente
a
days e b
giorni dopo la data zero, è quindi
f(b) - f(a)
Se devi utilizzare lunedì come data zero, allora il numero di giorni lavorativi
prima della data X, che è x
giorni dopo la data zero, è f(x) - 1
.