J'ai regardé au moins 2 douzaines de sujets à ce sujet et je n'ai pas encore trouvé de bonne réponse, alors je viens à vous de demander à nouveau des réponses concernant le sujet redouté des événements répétés.
I ' J'ai eu des répétitions quotidiennes, hebdomadaires, mensuelles et annuelles fonctionnant bien pour l'instant (j'ai encore besoin de réorganiser le système avec des événements d'exception et de tels que, mais cela fonctionne pour le moment). Mais, nous voulons pouvoir ajouter la capacité de répéter des événements sur le (1er, 2ème, 3ème, 4ème, 5ème) [Sun | Lun | Mar | Mer | Jeu | Fri | Sam] de chaque mois, tous les deux mois, et tous les trois mois. P>
Maintenant, si je peux simplement comprendre la logique pour le mois, je peux comprendre tous les mois et tous les trois mois. P>
Voici un peu de ce que j'ai jusqu'à présent (note: je ne dis pas que j'ai la meilleure façon de le faire ou quoi que ce soit, mais le système est celui que nous mettons à jour très lentement au fil du temps lorsque nous ne sommes pas occupés avec d'autres projets, alors je fais le Code plus efficace, car j'ai le temps). p>
Je reçois d'abord les dates de départ et de fin formatées pour les calculs de date: p> alors j'ai la différence Entre ces deux pour savoir combien de fois pour répéter avec une fonction, je suis assez certain que j'ai trouvé ici il y a quelque temps et diviser ce montant de 28 jours pour obtenir à peu près combien de fois il doit répéter pour qu'il y ait un par mois : p> alors j'ajoute le (1er, 2e, etc ...) partie au [Sun | Lun | etc ...] Partie à déterminer ce qu'ils cherchent à me donner quelque chose comme "premier dimanche": p> alors j'utilise une boucle qui exécute le numéro de fois, cela doit répéter (le Nombre de $ Repeat_Number d'en haut): P> for($m = 0; $m <= $repeat_number; $m++) {
if($m == 0) {
$month = date('F', substr($starting,0,2));
} else {
$month = date('F', strtotime($month . ' + ' . $m . ' months'));
}
$repeat_date = strtotime($find . ' in ' . $month);
}
3 Réponses :
Voici une alternative possible pour vous. strtotime code>
est puissant et comme
Vous pouvez l'utiliser pour générer le premier via la nième jour de la semaine spécifique à l'aide du format" de ". Voici un exemple en utilisant date_create code>
pour appeler un strtotime code> fonctionne de la même manière: p>
php > echo date('l F d Y H:i:s', strtotime('+14 days', strtotime('First Thursday of March 2011')));
Thursday March 17 2011 00:00:00
Juste une tête allant jusqu'à quelqu'un d'autre qui envisage d'utiliser cela, la partie "de" de Strtotime ne fonctionne pas sur PHP V4.3.9.
@ scientifique, pourquoi écrivez-vous toujours du code conçu pour cette version PHP préhistorique? PHP4 a été mort et non pris en charge pour les années littéralement.
Nous avons notre CMS et nos clients sur un ancien serveur parce que mon patron a toujours eu tout ce qui existe depuis environ 5 ans. En fait, je l'ai convaincu que nous devons le déplacer, cela prend simplement un peu de préparation pour déplacer le système contrôlant tous les sites de vos clients sur un nouveau serveur (et il faut travailler pour préparer des personnes à changement). Votre réponse a travaillé merveille sur mon serveur de test et sur le serveur que nous envisageons de déplacer le CMS à. Mes doigts sont traversés que la semaine prochaine, je ne devrai pas traiter avec PHP 4.3.9.
Notez que la plupart d'entre elles ne sont disponibles que Post 5.3. Si vous avez essayé le lundi dernier mars 2013, cela ne fonctionnerait pas dans 5.2
Je le fais comme ça:
J'ai une méthode plus simple, bien que cela puisse sembler hack-ish.
Ce que nous pouvons faire est de prendre la date de début et de déduire la valeur "n" en prenant le plafond de sa journée divisée par 7 . P>
Par exemple, si votre date de début est le 18, nous divisons par 7 et prenez le plafond pour déduire qu'il s'agit du 3ème "Quelque jour" du mois. P>
À partir de là, nous pouvons simplement ajouter à plusieurs reprises 7 jours à cela pour obtenir une nouvelle date et chaque fois que la nouvelle quo-à-quoe au plafond de la nouvelle date est 3, nous avons frappé le prochain "NTH Quel que soit le jour" du mois. P> Certains code peuvent être vus ci-dessous: P>
$day_nth = ceil(date("j", strtotime($date))/7); for ($i = 0; $i < $number_of_repeats; $i++) { while (ceil(date("j", strtotime($date))/7) != $day_nth) $date = date("Y-m-d", strtotime("+7 days", strtotime($date))); /* Add your event, or whatever */ /* Now we increment date by 7 days before the loop starts again, ** otherwise the while loop would never execute and we'd just be ** adding to the same date repeatedly. */ $date = date("Y-m-d", strtotime("+7 days", strtotime($date))); }
Merci, j'avais bêtement utilisé étage ($ start / 7) + 1 code> ce qui ne va pas sur les 7ème, 14ème, 21ème et 28, mais ok les autres jours :)
N'oubliez pas de soutenir le même motif à partir de la fin du mois, ou du dernier dernier chaque mois.
Vous devez renommer votre fonction
date_diff code> lorsque vous mettez à niveau sur PHP 5.3, il sera en conflit avec le
datation_diff code> fonction
.Merci pour l'information Charles. Je n'étais pas au courant qu'ils ont ajouté une fonction date_diff.