La réponse de John Conde est correct, mais voici une solution plus efficace et 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;
Permettez-moi de le décomposer pour vous.
$start = new DateTime('2013-01-06');
$end = new DateTime('2013-01-20');
D'abord, créer des objets DateTime, qui sont des objets puissants PHP intégré signifiait exactement pour ce genre de problème.
$days = $start->diff($end, true)->days;
Ensuite, utilisez DateTime::diff pour trouver la différence de $start
à $end
(en passant true
ici comme second paramètre assure que cette valeur est toujours positive), et obtenir le nombre de jours entre eux.
$sundays = intval($days/7) + ($start->format('N') + $days % 7 >= 7);
Voici le grand - mais ce n'est pas si compliqué, vraiment. Tout d'abord, nous savons qu'il y a un dimanche pour chaque semaine, donc nous avons au moins $days/7
les dimanches pour commencer, arrondis au int
avec intval
.
En plus de cela, il pourrait y avoir un dimanche dans un laps de temps de moins d'une semaine; par exemple, du vendredi au lundi de la semaine suivante contient 4 jours; l'un d'eux est un dimanche. Donc, en fonction du moment où nous commençons et finissons, il pourrait y en avoir un autre. Cela est facile à expliquer:
$start->format('N')
(voir DateTime::format) nous donne la ISO-8601 jours de la semaine pour la date de début, qui est un nombre de 1 à 7 (1 est le lundi 7 est dimanche) .
$days % 7
nous donne le nombre de jours restants qui ne se divisent pas uniformément en semaines.
Si notre jour de départ et le nombre de jours restants totalisent 7 ou plus, alors nous avons atteint un dimanche. Sachant cela, il suffit d'ajouter cette expression, ce qui nous donnera 1
s'il est vrai ou 0
s'il est faux, puisque nous l'ajoutons à une valeur int
.
Et voilà! L'avantage de cette méthode est qu'elle ne nécessite pas d'itération tous les jours entre les temps donnés et de vérifier si c'est un dimanche, ce qui vous permettra d'économiser beaucoup de calcul, et aussi vous fera paraître vraiment intelligent. J'espère que cela pourra aider!
Pouvez-vous utiliser une boucle sur une chaîne de date comme ça? – andrewsi
Vous ne pouvez pas incrémenter une chaîne comme celle-ci. Regardez comment les autres le font: http://stackoverflow.com/search?q=php+number+of+sundays –
Est-ce pour un [projet euler problème (19)] (http://projecteuler.net/problem=19)? – HamZa