PHP - 下一个每两周一次的会议日期


PHP - Next biweekly meeting date

我希望从给定日期开始的下一次每两周(每 2 周)会议中计算 PHP。

因此,鉴于第一次会议是在 2015 年 12 月 1 日,并且每 2 周举行一次,那么从给定日期开始下一次会议的日期是什么时候?

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

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

输出:

Next meeting is: Tue, 22 Mar 2016
Next meeting is: Tue, 22 Mar 2016

尝试计算日期之间的差异,找到事件之间天数的下一个倍数(在本例中为 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);
?>