risposta di John Conde è corretto, ma qui è una soluzione più efficiente e mathy:
$start = new DateTime('2013-01-06');
$end = new DateTime('2013-01-20');
$days = $start->diff($end, true)->days;
$sundays = intval($days/7) + ($start->format('N') + $days % 7 >= 7);
echo $sundays;
Fammi scomposizione per voi.
$start = new DateTime('2013-01-06');
$end = new DateTime('2013-01-20');
In primo luogo, creare alcuni DateTime oggetti, che sono potenti built-in PHP oggetti significava esattamente per questo tipo di problema.
$days = $start->diff($end, true)->days;
successiva, utilizzare DateTime::diff trovare la differenza da $start
a $end
(passando true
qui come secondo parametro assicura che questo valore è sempre positivo), e ottenere il numero di giorni tra loro.
$sundays = intval($days/7) + ($start->format('N') + $days % 7 >= 7);
Ecco che arriva il grande - ma non è così complicato, davvero. Per prima cosa, sappiamo che esiste una domenica per ogni settimana, quindi abbiamo almeno $days/7
domeniche, arrotondate al più vicino int
con intval
.
Oltre a ciò, potrebbe esserci una domenica in un lasso di tempo inferiore a una settimana; ad esempio, dal venerdì al lunedì della settimana successiva contiene 4 giorni; uno di questi è una domenica. Quindi, a seconda di quando iniziamo e finiamo, potrebbe essercene un altro. Questo è facile da spiegare:
$start->format('N')
(vedi DateTime::format) ci dà la ISO-8601 giorno della settimana per la data di inizio, che è un numero da 1 a 7 (1 è Lunedi, 7 è la Domenica) .
$days % 7
ci dà il numero di giorni rimanenti che non si dividono equamente in settimane.
Se il giorno di inizio e il numero di giorni rimanenti sono 7 o più, abbiamo raggiunto la domenica. Sapendo questo, dobbiamo solo aggiungere quell'espressione, che ci darà 1
se è vera o 0
se è falsa, poiché la aggiungiamo a un valore int
.
E ce l'hai! Il vantaggio di questo metodo è che non richiede iterazioni ogni giorno tra i tempi prestabiliti e controlla se è domenica, il che ti farà risparmiare un sacco di calcoli e ti farà sembrare davvero intelligente. Spero possa aiutare!
si può utilizzare un ciclo for in una stringa di data del genere? – andrewsi
Non è possibile incrementare una stringa del genere. Guarda come gli altri lo fanno: http://stackoverflow.com/search?q=php+number+of+undays –
È questo per un [problema euler del progetto (19)] (http://projecteuler.net/problem=19)? – HamZa