2011-01-12 56 views
7

Así que he pasado bastante tiempo investigando la mejor manera de agregar eventos recurrentes a mi aplicación de calendario.Usando PHP DateInterval para crear eventos recurrentes

me gustaría utilizar la función de PHP DateInterval y han formulado el siguiente código para tratar de encontrar la manera de crear un evento recurrente en base a los eventos originales Start Date, Finish Date y la EndDate of Recurrence.

//user defined event start and finish dates 
$eventStart = new DateTime('2011-01-31 09:00:00'); 
$eventFinish = new DateTime('2011-01-32 17:00:00'); 

//user defined event recurring end date 
$endRecurring = new DateTime('2011-05-31 23:59:59'); 

//define for recurring period function 
$begin = $eventStart; 
$end = $endRecurring; 

//define our interval 
$interval = DateInterval::createFromDateString('next friday'); 
$period = new DatePeriod($begin, $interval, $end, DatePeriod::EXCLUDE_START_DATE); 

//loop through and create new dates for recurring events 
foreach ($period as $dt) 
    $recurringStartDate = $dt->format("l Y-m-d H:i:s\n"); 
    $recurringEndDate = ?NOT SURE HOW TO PROCESS THE END DATE IN THIS START DATE FOREACH LOOP? 

Es de esperar que cree una lista de nuevas fechas de inicio de eventos. PERO también necesito definir nuevas fechas de finalización para mis eventos recurrentes. ¿Cómo hago esto? ¿Debo procesar esto en el ciclo de inicio de la fecha de inicio del evento?

Mi otra pregunta es cómo podría combinar múltiples dateIntervals para encargarme de Repeat every Monday, Wednesday and Friday? Actualmente solo dateIntervals únicos funcionan como next friday

¡Gracias por su ayuda!

Tim

Respuesta

12

hay una biblioteca recursividad Fecha/Calendario para PHP 5.2 + por Thomas Planer. No es DateInterval, pero parece hacer el truco. Échale un vistazo al https://github.com/tplaner/When

Sé que esta es una vieja pregunta, pero tal vez alguien se beneficie.

+0

¡Cuándo es asombroso, y ahora lo estoy usando! – Tim

0

yo uso strtotime() para este tipo de cosas. parece ser mas facil funciona así

$new_timestamp = strtotime('+1 week', time()); // + 1 week from today 
$new_timestamp = strtotime('+1 week', $new_timestamp); // + 2 weeks from now 
$new_timestamp = strtotime('+1 month', $new_timestamp); // + 1 month and 2 weeks from now 

incluso se puede comenzar con cualquier cadena de fecha que desee como esto

$new_timestamp = strtotime('+1 week', strtotime('2011-01-31 09:00:00')); // one week from 2011-01-31 

entonces se puede emitir la marca de tiempo en cualquier formato utilizando la función date()

echo date('Y-m-d', $new_timestamp); 

Déjame saber si tienes preguntas

+0

Hola, gracias por tu respuesta. He investigado el uso de strtotime() pero me deja en la misma posición que el problema en el ciclo foreach. Mi aplicación requiere que genere un lote de eventos recurrentes que puedo hacer para la fecha de inicio de cada evento recurrente, pero no para la fecha de finalización. Además, ¿cómo puedo combinar varios días para resolver el problema 'Repetir todos los lunes, miércoles y viernes' con strtotime()? – Tim

+0

strtotime ('el próximo viernes + 1 semana')?averiguar la cantidad de tiempo entre el inicio y el final, y agregarlo a su nueva fecha de inicio. – dqhendricks

+0

repite en ciertos días de la semana, debe mantenerlos almacenados en algún lugar, y usar cualquiera que sea el siguiente. podría procesar un valor de semanas, ordenar, luego colocar el que está en la parte superior (la próxima fecha X más próxima). – dqhendricks

6

Hola tuvieron que desarrollar algo similar y lo hice el que fluye:

$event_date = "2012-10-06"; 
$event_end_date = "2012-10-08"; 
$event_repetition_type = "Daily"; 

$date_calculation = ""; 
switch ($event_repetition_type) { 
    case "Daily": 
    $date_calculation = " +1 day"; 
    break; 
case "Weekly": 
    $date_calculation = " +1 week"; 
    break; 
case "Monthly": 
    $date_calculation = " +1 month"; 
    break; 
default: 
    $date_calculation = "none"; 
} 

$dateArray[] = $event_date; 

$day = strtotime($event_date); 
$to = strtotime($event_end_date); 

while($day <= $to) 
{ 
    $day = strtotime(date("Y-m-d", $day) . $date_calculation); 
    $dateArray[] = date("Y-m-d" , $day); 
    } 


//here make above array as key in $a array 
$a = array_fill_keys($dateArray, 'none'); 
print_r($a); 
0

Se podría calcular un DateInterval para la duración de los eventos definidos por el usuario, así:

$eventStart = new DateTime('2011-01-31 09:00:00'); 
$eventFinish = new DateTime('2011-01-31 17:00:00'); 
$eventDuration = $eventStart->diff($eventFinish); 

después en su bucle, simplemente clonar la fecha recurrente y añadir la $eventDuration calculada de nuevo en

$until = clone $dt; 
$until->add($eventDuration); 

¡También debe manejar algunos errores ya que los datos finales del usuario son "2011-01-32"!

Cuestiones relacionadas