我有一个事件数据库,它们都是"静态" (在特定的一天)和"经常性的" (从特定的一天开始,但设置为"重复"每周或每隔一周)。我知道需要有7和14的间隔,但我不知道如何找到一个日期>今天吐了出来。
这样的例子;
我想找到下一个即将发生的重复活动并吐出相关日期。附注:我正在使用的数据是Ymd的字符串(我知道,我知道)所以20150821将是2015年8月21日。
如果今天是2015年8月21日,那么"每隔一个星期五"会有一个定期举办的活动。从8月7日开始,它将是+14,这将使你今天,8月21日星期五。
但是说有一个"每个星期三"从8月19日开始,我想知道8月26日星期三的日期并吐出来。
这将需要在将来的无限日期工作,开始日期永远不会改变。
所以在2016年1月1日运行脚本,我需要知道下一个"每周三"是2016年1月6日。
伪代码:
if(start_date < today_date) {
// start date is in the past
add recurring_inverval to start_date until result >= today_date
echo result
} elseif(start_date > today_date {
// start date is in the future
echo start_date
}
直到x,我才迷失了。不确定如何在if语句中做到这一点。
也不确定这是不是最好的方法。我知道PHP也可以做复杂的字符串并将它们转换为日期。喜欢&#34;下周六&#34;
答案 0 :(得分:1)
我知道你自己回答了这个问题,但是另一个选择就是使用当前日期减去开始日期的模数(去掉后的余数)来计算你的下一个日期。这是一个快速的脚本:
<?php
function nextDate($start_date,$interval_days,$output_format){
$start = strtotime($start_date);
$end = strtotime(date('Y-m-d'));
$days_ago = ($end - $start) / 24 / 60 / 60;
if($days_ago < 0)return date($output_format,$start);
$remainder_days = $days_ago % $interval_days;
if($remainder_days > 0){
$new_date_string = "+" . ($interval_days - $remainder_days) . " days";
} else {
$new_date_string = "today";
}
return date($output_format,strtotime($new_date_string));
}
echo nextDate('20151210',14,'Ymd') . "<br />";
echo nextDate('20150808',14,'Ymd') . "<br />";
?>
如果&#34;开始日期&#34;您也不希望早日返回。是在遥远的未来。更新代码以防止这种情况。
答案 1 :(得分:0)
自己解决了:
$begin = new DateTime($start_date); // start searching on the start date of the event
$end = new DateTime(date('Ymd')); // end on today's date
$end = $end->modify('+1 month'); // extend search to the next month
$interval = new DateInterval('P'. $freq_math .'D'); // intervals of Plus X Days - uses frequency math of 7 or 14 for every or every other
$daterange = new DatePeriod($begin, $interval, $end);
foreach($daterange as $date) {
if($date->format('Ymd') >= date('Ymd')) {
$next_recurring_date = $date->format('Ymd');
break;
}
}
echo $next_recurring_date;