【问题标题】:PHP - find next future recurring date?PHP - 找到下一个未来的重复日期?
【发布时间】:2015-08-22 03:33:22
【问题描述】:

我有一个“静态”(在特定日期)和“重复”(从特定日期开始,但设置为每周或每隔一周“重复”)的事件数据库。我知道需要有 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 也可以处理复杂的字符串并将它们转换为日期。比如“下周六”

【问题讨论】:

    标签: php date


    【解决方案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 />";
    ?>
    

    如果“开始日期”在遥远的将来,您也不希望返回一个较早的日期。已更新代码以防止这种情况发生。

    【讨论】:

      【解决方案2】:

      自己解决了:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-14
        • 1970-01-01
        • 2013-03-23
        • 2011-10-06
        • 2015-07-19
        • 1970-01-01
        • 1970-01-01
        • 2019-07-09
        相关资源
        最近更新 更多