使用PHP DateInterval创建重复事件

使用PHP DateInterval创建重复事件,php,datetime,date,Php,Datetime,Date,所以我花了很多时间研究如何最好地将重复事件添加到我的日历应用程序中 我想使用PHP DateInterval函数,并编写了下面的代码,以尝试解决如何基于原始事件开始日期、完成日期和定期结束日期创建定期事件 //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'

所以我花了很多时间研究如何最好地将重复事件添加到我的日历应用程序中

我想使用PHP DateInterval函数,并编写了下面的代码,以尝试解决如何基于原始事件
开始日期
完成日期
和定期结束日期创建定期事件

//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?
这将有望创建一个新事件开始日期的列表但我还需要为定期事件定义新的结束日期。我该怎么做?我是否需要在每个循环的事件开始日期中处理此问题

我的另一个问题是如何组合多个日期间隔来处理每周一、周三和周五重复的
?目前只有一个日期间隔像下周五那样工作,我使用strotime()来做这类事情。似乎更容易。像这样工作

$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()函数以任何格式输出时间戳


如果您有任何问题,请告诉我。

嗨,我必须开发类似的产品,我做了以下工作:

$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);
$event_date=“2012-10-06”;
$event_end_date=“2012-10-08”;
$event\u repeation\u type=“Daily”;
$date_calculation=“”;
开关($event\u repeation\u type){
个案“每日”:
$date_calculation=“+1天”;
打破
案例“每周”:
$date_calculation=“+1周”;
打破
个案“每月”:
$date_calculation=“+1个月”;
打破
违约:
$date\u calculation=“无”;
}
$dateArray[]=$event\u date;
$day=strottime($event\u date);
$to=STROTIME($event\u end\u date);

虽然($day有一个Thomas Planer为PHP 5.2+编写的日期/日历递归库。它不是DateInterval,但似乎起到了作用。请查看。

您可以计算用户定义事件持续时间的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”!

这篇文章很旧,但应该注意的是,当谈论重复时,方法是


有几个PHP库可以解决这个问题:

您好,谢谢您的回答。我已经研究过如何使用strotime()但它让我与foreach循环中的问题处于相同的位置。我的应用程序要求我生成一批重复事件,我可以为每个重复事件的开始日期生成这些事件,但不能为结束日期生成这些事件。此外,我如何将多天一起批处理,以解决每个星期一、星期三和星期五重复出现的问题trtotime()?strtotime(“下周五+1周”)?计算开始和结束之间的时间量,并将其添加到新的开始日期。在某些工作日重复此操作,您必须将它们存储在某个位置,并使用下一个日期。您可以处理一周的日期,排序,然后将其放在顶部(最早的下一个X日期)。也许将日期转换为朱利安日期会有所帮助。我相信有一些关系,比如被7平均整除意味着这是一个星期天。如果你想在两个日期之间的所有星期一,只需将mod 7为1的朱利安日期转换回公历日期格式。什么时候很好,我现在正在使用它!
$until = clone $dt;
$until->add($eventDuration);