PHP-下一次双周会议日期
我期待着在PHP计算下一个双周(每2周)会议从一个给定的日期 鉴于第一次会议是在2015年12月1日,每两周召开一次,那么从给定日期开始的下一次会议的日期是什么 我认为显而易见的答案是: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
$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);
?>