Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using PHP DateInterval to create recurring events

Tags:

date

php

datetime

So I have spent quite a bit of time researching how best to add recurring events to my calendar application.

I would like to use the PHP DateInterval function and have formulated the code below to try and work out how to create a recurring event based on the original events Start Date, Finish Date and the 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?

This should hopefully create a list of new event start dates. BUT I also need to define new end dates for my recurring events. How do I do this? Do I need to process this in the event start date foreach loop?

My other question is how I could combine multiple dateIntervals to take care of Repeat every Monday, Wednesday and Friday? Currently only single dateIntervals are working like next friday

like image 201
Tim Avatar asked Jan 12 '11 22:01

Tim


People also ask

How do I create a recurring event in Wordpress?

To begin, go to Add Event and click the event date to expand the options. Click Repeat Event to add a recurrence rule. A recurring event could occur every week on the same day, for one example. If you're going on holiday for a week, add an exception to the recurrence.

How do I use DateInterval?

A common way to create a DateInterval object is by calculating the difference between two date/time objects through DateTimeInterface::diff(). Since there is no well defined way to compare date intervals, DateInterval instances are incomparable.

How are recurring events stored in a database?

Add a recurrence domain to the database that supports a number of different values, including “daily”, “weekly”, and “monthly”. Add a recurrence column to the events table that identify how an event recurs. Add a recurrence_dates table that contains a pre-generated list of recurrences for a given date.


2 Answers

There is a Date/Calendar recursion library for PHP 5.2+ by Thomas Planer. Its not DateInterval, but it seems to do the trick. Check it out at https://github.com/tplaner/When.

like image 106
Brian Avatar answered Sep 28 '22 05:09

Brian


Hi I had to develop something similar and i did the flowing:

$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);
like image 23
Zifre Avatar answered Sep 28 '22 07:09

Zifre