日期存在于接下来的几个月 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
我是 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