使用PHP DateInterval创建重复事件

11

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

我想使用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?
希望这能生成一份新事件开始日期的列表。但我还需要为我的重复事件定义新的结束日期。我该怎么做?我需要在事件开始日期的foreach循环中处理吗? 另一个问题是如何组合多个dateInterval来处理“每周一、三和五重复”的情况?目前只能单独使用dateInterval,例如“下周五”。
5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
15

有一个适用于PHP 5.2+的日期/日历递归库,由Thomas Planer创建。它不是DateInterval,但似乎可以胜任。请访问https://github.com/tplaner/When查看。


当它很棒时,我现在正在使用它! - Tim

9

你好,我曾经需要开发类似的东西,我已经完成了以下步骤:

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

很好...你有对这段代码进行过任何改进吗?检查节假日?如果可能的话,请分享一下? - MarcoZen
1
嗨@MarcoZen,我们在手动表格中检查假期,因为我们尝试的任何API或其他功能都会在某些特定的日子失败。 - open-ecommerce.org
已记录。谢谢分享。 - MarcoZen

0
我在这种情况下使用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);
如果有问题,请告诉我。

你好,谢谢你的答复。我已经研究了使用strtotime()函数,但它让我在foreach循环中仍面临同样的问题。我的应用程序要求我生成一批重复事件,我可以为每个重复事件的起始日期做到这一点,但无法确定结束日期。而且,我该如何将多个日期组合在一起以解决“每周一、三和五重复”这个问题? - Tim
strtotime('next friday + 1 week')?找出开始和结束之间的时间量,并将其添加到您的新开始日期。 - dqhendricks
在某些工作日重复,您必须将它们存储在某个地方,并使用下一个。您可以处理一周的日期,排序,然后放置在顶部的日期(最早的下一个X日期)。 - dqhendricks
也许将日期转换为儒略日会有所帮助。我相信有一些关系,比如被7整除意味着是星期天。如果你想要在两个日期之间得到所有的星期一,只需获取具有模7等于1的儒略日期,并将它们转换回公历日期格式即可。 - Kinjal Dixit

0
您可以这样计算用户定义事件的时间间隔:
$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”,您应该进行一些错误处理!


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,