日期存在于接下来的几个月 php

Date is exists in next coming months php

我是 PHP 的新手。我正在显示每个月从 03/31/2021 开始的月度事件,所以这是一个危急情况,因为并非每个月都存在 31 日期。因此,有一些 php 功能可用于检查此日期是否存在于接下来的几个月中。如果存在则显示该日期的事件,否则显示该月的最后一天。

$monthly_counter = 0;
$monthly_counter_offset = 0;
$begin = new DateTime($val->start);  // $val->start = '03/31/2021'
$end = new DateTime($val->repeat_end_date); // $val->repeat_end_date= '03/31/2022'
$interval = DateInterval::createFromDateString('1 month');
$period = new DatePeriod($begin, $interval, $end);
    foreach ($period as $dt)
        {
            $loop_date = $dt->format('m/d/Y');
            $loop_date_formatted = $dt->format('Y-m-d');

            $due_dates[] = $from_date_times;
            $from_new_date_times = date('Y-m-d H:i', strtotime('+1 month', strtotime($from_date_times)));
            $from_date_times = $from_new_date_times;
            $deletedevents2=$val->deletedevents;
            $arrayofdeleted=explode(",",$deletedevents2);
            $originalDate = $from_date_times;
            $newDateforcompare = date("m/d/Y", strtotime($originalDate));
              if (in_array($loop_date_formatted, $arrayofdeleted))
                {
                    continue;
                }

                $number_of_days = $val->number_of_days;
                $end_new_date_times = date('Y-m-d H:i', strtotime('+'.$number_of_days.' day', strtotime($loop_date)));
                if(date('Y-m-d ', strtotime($val->start))<date('Y-m-d', strtotime($val->ends))) 
                    {
                    $end_new_date_times = date('Y-m-d H:i', strtotime('+1 day', strtotime($end_new_date_times)));
                    }

                        $skipcounter = $val->interval_value;
                        if (!empty($skipcounter) || $skipcounter != 1) {
                            $monthly_counter++;
                            $monthly_counter_offset++;
                            if ($monthly_counter == $skipcounter || $monthly_counter_offset == 1) {
                                $monthly_counter = 0;
                            } else {
                                continue;
                            }
                        } else {
                        }


                        $rows[] = array(
                            'id' => $val->id,
                            'title' => $val->title,
                            'description' => $val->calendar_comments,
                            'start' => $loop_date,
                            'end' => $end_new_date_times,
                            'borderColor'=>$val->color,
                            'backgroundColor'=>$val->color_bg,
                            'className'=>'timegridclass',
                            'allDay' => $allday,

                        );
                    }

由于您使用的是 fullCalendar,您可以简单地指定一个使用 RRule 指定重复的事件,而不是使用复杂的 PHP 代码来尝试生成它。

例如

  events: [
    {
      title: "Sales Meeting",
      rrule: "FREQ=MONTHLY;BYMONTHDAY=28,29,30,31;BYSETPOS=-1"
    }
  ]

工作演示:https://codepen.io/ADyson82/pen/bGByBaV

这将生成一个在每个月的最后一天重复的事件,无论这个月是 28、29、30 还是 31 天。

显然,您可以使用 PHP 生成此事件 object,并根据您的数据库内容使用自定义标题、start/end 日期等对其进行增强。但我已经向您展示了基本方法。

对于特定的 RRule 字符串归功于 this answer

文档:https://fullcalendar.io/docs/rrule-plugin and https://github.com/jakubroztocil/rrule