PHP-下一次双周会议日期

PHP-下一次双周会议日期,php,datetime,Php,Datetime,我期待着在PHP计算下一个双周(每2周)会议从一个给定的日期 鉴于第一次会议是在2015年12月1日,每两周召开一次,那么从给定日期开始的下一次会议的日期是什么 我认为显而易见的答案是: $start = new DateTime('2015-12-01'); // Meeting origination date $target = new DateTime('2016-03-10'); // The g

我期待着在PHP计算下一个双周(每2周)会议从一个给定的日期

鉴于第一次会议是在2015年12月1日,每两周召开一次,那么从给定日期开始的下一次会议的日期是什么

我认为显而易见的答案是:

$start = new DateTime('2015-12-01');                        // Meeting origination date
$target = new DateTime('2016-03-10');                       // The given date
$targetPlus = clone $target;                                // Could use DateTimeImmutable for $target (PHP>=5.5)
$targetPlus->modify("+3 weeks");                            // Get a date *past* the next possible meeting                                                          
$interval = new DateInterval("P2W");                        // Create a 2 week interval
$period   = new DatePeriod($start, $interval, $targetPlus); // Get all dates from orig to target+2weeks
foreach ($period as $date) {                                // Look at all dates in the Period
    if ($date > $target) {                                  // find first > target
        print("Next meeting is: " . $date->format('D, d M Y') . "\n");
        break;
    }
}

但是想知道是否有一种方法可以避免在给定日期之前(然后是某些日期)循环通过所有可能的会议。

是的,有更明确的方法,您可以使用以下代码计算新会议的日期:
$targetMeeting

<?php
date_default_timezone_set('America/Los_Angeles');

$start = new DateTime('2015-12-01');                        // Meeting origination date
$target = new DateTime('2016-03-10');                       // The given date
$targetPlus = clone $target;                                // Could use DateTimeImmutable for $target (PHP>=5.5)
$targetPlus->modify("+3 weeks");                            // Get a date *past* the next possible meeting
$interval = new DateInterval("P2W");                        // Create a 2 week interval

/* -- Begin of new code --*/
$targetMeeting = clone $target;
$intervalBetweenTargetAndStart = $target->diff($start);
$daysBeforeMeeting = 14 - $intervalBetweenTargetAndStart->days % 14;
$targetMeeting->modify("+".$daysBeforeMeeting." days");
print("Next meeting is: " . $targetMeeting->format('D, d M Y') . "\n");
/* -- End of new code --*/

$period   = new DatePeriod($start, $interval, $targetPlus); // Get all dates from orig to target+2weeks
foreach ($period as $date) {                                // Look at all dates in the Period
    if ($date > $target) {                                  // find first > target
        print("Next meeting is: " . $date->format('D, d M Y') . "\n");
        break;
    }
}

尝试计算日期之间的差异,找出事件之间天数的下一个倍数(在您的案例14中),并将该天数添加到开始日期,如下所示:

<?php
$daysBetween = 14;
$start = new DateTime('2015-12-01');                        // Meeting origination date
$target = new DateTime('2016-03-10');                       // The given date
$daysApart = $start->diff($target)->days;                   
$nextMultipleOfDaysBetweenAfterDaysApart = ceil($daysApart/$daysBetween) * $daysBetween;
$dateOfNextMeeting = $start->modify('+' . $nextMultipleOfDaysBetweenAfterDaysApart . 'days');
var_dump($dateOfNextMeeting);
?>

<?php
$daysBetween = 14;
$start = new DateTime('2015-12-01');                        // Meeting origination date
$target = new DateTime('2016-03-10');                       // The given date
$daysApart = $start->diff($target)->days;                   
$nextMultipleOfDaysBetweenAfterDaysApart = ceil($daysApart/$daysBetween) * $daysBetween;
$dateOfNextMeeting = $start->modify('+' . $nextMultipleOfDaysBetweenAfterDaysApart . 'days');
var_dump($dateOfNextMeeting);
?>