我希望从给定日期开始的下一次每两周(每 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);
?>