【问题标题】:Date is exists in next coming months php日期存在于未来几个月 php
【发布时间】:2021-03-17 10:35:12
【问题描述】:

我是 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.io/docs/recurring-events
  • 这是客户自定义重复周期的要求
  • 您可以使用checkdate() 来验证日期是否存在。
  • 获取每月的最后一天 echo date('d/m/Y', strtotime('last day of this month'));echo date('d/m/Y', strtotime('now + 2 month last day of this month'));
  • @MarkusZeller 我正在检查这个

标签: php fullcalendar


【解决方案1】:

由于您使用的是 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 生成此事件对象,并根据您的数据库内容使用自定义标题、开始/结束日期等对其进行增强。但我已经向您展示了基本方法。

感谢this answer 获取特定的RRule 字符串。

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

【讨论】:

  • 是的,这确实是一种非常简单的处理方式,但是客户端正在添加一些代码,所以我只需按照代码和要求进行操作
猜你喜欢
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多