Использование PHP DateInterval для создания повторяющихся событий

Итак, я потратил немало времени на изучение того, как лучше добавлять повторяющиеся события в мое приложение календаря.

Я хотел бы использовать функцию PHP DateInterval и сформулировал приведенный ниже код, чтобы попытаться определить, как создать повторяющееся событие на основе исходных событий Start Date, Finish Date и 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?

Это, надеюсь, создаст список новых дат начала мероприятия. НО мне также нужно определить новые даты окончания для повторяющихся событий. Как мне это сделать? Нужно ли обрабатывать это в цикле даты начала события foreach?

Мой другой вопрос: как я мог бы комбинировать несколько dateIntervals, чтобы позаботиться о Repeat every Monday, Wednesday and Friday? В настоящее время только одиночные dateIntervals работают как next friday

Спасибо за вашу помощь!

Тим

4 ответа

Существует библиотека рекурсии даты/календаря для PHP 5.2+ от Thomas Planer. Это не DateInterval, но, похоже, это трюк. Проверьте это на https://github.com/tplaner/When

Я знаю, что это старый вопрос, но, возможно, кто-то выиграет!


Привет, мне пришлось разработать нечто подобное, и я сделал текущее:

$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);


Вы можете рассчитать DateInterval для продолжительности определенных пользователем событий следующим образом:

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

то в вашем цикле просто клонируйте повторяющуюся дату и добавьте вычисленный $eventDuration назад на

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

Также вы должны сделать некоторую обработку ошибок, так как ваши конечные данные пользователя "2011-01-32"!


Я использую strtotime() для такого рода вещей. кажется, проще. работает так.

$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

вы даже можете начать с любой строки даты, которая вам нужна,

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

тогда вы можете выводить временную метку в любом формате, используя функцию date()

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

Сообщите мне, если у вас есть вопросы.

licensed under cc by-sa 3.0 with attribution.