PHP - 查找下一个未来的重复日期?

时间:2015-08-22 03:33:22

标签: php date

我有一个事件数据库,它们都是"静态" (在特定的一天)和"经常性的" (从特定的一天开始,但设置为"重复"每周或每隔一周)。我知道需要有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;

2 个答案:

答案 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;