2012-06-02 2 views
6

J'ai une application de planification web que je suis en train de réécrire et j'ai des questions sur la façon de travailler avec des rendez-vous récurrents (je sais qu'il ne manque pas de meilleure façon de le faire "quand il s'agit de recettes récurrentes).php - travailler avec des dates comme "toutes les deux semaines le mardi"

Je veux proposer des rendez-vous récurrents où l'utilisateur peut planifier un rendez-vous pour une date comme Sam 2 Juin, et il devrait répéter toutes les deux semaines, le samedi pendant une certaine période de temps prédéterminée (comme 1 an).

Quelles fonctions php peuvent m'aider à déterminer la date à laquelle "tous les autres samedis" tombe? Je joins une photo de mon interface utilisateur pour la clarification.

enter image description here

+1

Des choses comme 'strtotime ('Next Saturday')' est assez facile, sauf si vous voulez des choses plus compliquées :) –

+0

Donc est-il utilisé dans un calendrier pour l'utilisateur, où ils recherchent activement les informations sur leur rendez-vous est-ce qu'ils ont besoin d'un rappel? Ou a-t-il besoin de leur envoyer un message automatisé ou quelque chose comme ça tout seul? –

+0

Salut Max, mon application permet aux utilisateurs de planifier des rendez-vous, puis envoie des rappels à leurs clients du prochain rendez-vous. Dans ce cas, je souhaite héberger un utilisateur qui réserve un rendez-vous "toutes les deux semaines le samedi" (ou toute autre combinaison que mon interface utilisateur peut créer). Mon souci était que l'ajout de 14 jours (dans ce cas) ne signifierait pas toujours que le rendez-vous tombait un samedi. – Greg

Répondre

14

Personnellement, je voudrais travailler avec DateTime objets et utiliser la classe DateInterval.

Dans votre cas ci-dessus, vous devez travailler à la date du premier/samedi prochain, puis juste travailler avec un intervalle de date P2W

exemple de base

$dow = 'saturday'; 
$step = 2; 
$unit = 'W'; 

$start = new DateTime('2012-06-02'); 
$end = clone $start; 

$start->modify($dow); // Move to first occurence 
$end->add(new DateInterval('P1Y')); // Move to 1 year from start 

$interval = new DateInterval("P{$step}{$unit}"); 
$period = new DatePeriod($start, $interval, $end); 

foreach ($period as $date) { 
    echo $date->format('D, d M Y'), PHP_EOL; 
} 

/* 
Sat, 02 Jun 2012 
Sat, 16 Jun 2012 
Sat, 30 Jun 2012 
Sat, 14 Jul 2012 
… 
Sat, 20 Apr 2013 
Sat, 04 May 2013 
Sat, 18 May 2013 
Sat, 01 Jun 2013 
*/ 
+0

Merci d'avoir ajouté l'exemple salathe –

+0

Je pense que c'est ce que je cherche! Merci Mark. Je vais essayer le matin, la contribution est très appréciée! – Greg

+0

Salut Mark, il semble que certaines de vos classes sont seulement disponibles en PHP 5.3.x (DatePeriod, DateInterval). Malheureusement, j'ai essayé de mettre à jour mon serveur ce matin et il a bloqué un tas de sites joomla que je cours donc je devais revenir à 5.2.9. Existe-t-il une approche similaire à votre solution en utilisant certaines fonctionnalités de la version 5.2.9? – Greg

0

Eh bien, je mettrais une date de début en premier lieu; quand ce jour est venu, vous venez de faire:

$next_date = strtotime('+2 weeks'); 

Cela vous arrive le même jour, mais seulement deux semaines plus tard. Et le cycle continue :)

0

vous pouvez utiliser un colonne de base de données pour stocker votre temps en secondes:

UPDATE appointments SET dtime=UNIX_TIMESTAMP() WHERE id=5 

puis, vous pouvez vérifier cette valeur à chaque fois qu'une période spécifique vient d'arriver/passé:

mysql_query("SELECT id FROM appointments WHERE dtime>='".(strtotime("-1 week"))."'); 

les ID sélectionnés ont 1 semaine ou plus.

Questions connexes