php 获取每周日期在周一,周五,X次

vsdwdz23  于 2023-09-29  发布在  PHP
关注(0)|答案(1)|浏览(128)

我想根据每周的重复找出下一个X日期。例如,今天的日期是2023年5月8日,我想找出接下来的4个星期一和星期五的日期(即每周周一、周五各4次)
因此预期结果为:
2023年5月8日
2023年5月12日
2023年5月15日
2023年5月19日

$appointment_start_date = "2023-05-08";
        $all_appointments[] = [
            'appointment_date' => $appointment_start_date
        ];
        $post['weekly_day'] = ["Monday", "Friday"];
        $recurrence_end_after = 4;
        // Create a new DateTime object
        $date = new \DateTime($appointment_start_date);
        
        for ($i=1; $i<=$recurrence_end_after; $i++) {
            foreach ($post['weekly_day'] as $weekly_day) {
                 if ($i > $recurrence_end_after) {
                     break;
                 }
                // Modify the date it contains
                $date->modify('next ' . $weekly_day);

                // Output
                $appointment_start_date = $date->format('Y-m-d');
                $all_appointments[] = [
                    'appointment_date' => $appointment_start_date
                ];
                $i++;
            }
        }

但是这个代码片段没有返回预期的结果。它只是返回
2023-05-08、2023-05-15、2023-05-19、2023-05-22,因此跳过星期五日期(即2023年5月12日)

多举几例

输入日期:2023年6月1日。
recurrence_end_after:6.
weekly_day:Monday,Friday.
预期输出:

  • 2023年6月1日
  • 2023年6月2日
  • 2023年6月5日
  • 2023年6月9日
  • 2023年6月12日
  • 2023年6月19日

输入日期:2023年5月10日。
recurrence_end_after:4.
weekly_day:Saturday,Sunday预期产量:

  • 2023年5月10日
  • 二〇二三年五月十三日
  • 2023年5月14日
  • 2023年5月19日
yi0zb3m4

yi0zb3m41#

$appointment_start_date = "2023-05-08";
$all_appointments[] = [
    'appointment_date' => $appointment_start_date
];
$post['weekly_day'] = ["Monday", "Friday"];
$recurrence_end_after = 4;

// Create a new DateTime object
$date = new \DateTime($appointment_start_date);

// get next 7 weekdays
$sorted_weekly_day = [];
$date_interval = DateInterval::createFromDateString('1 day');
for ($i=0; $i<7; $i++) {
    $sorted_weekly_day[] = $date->add($date_interval)->format('l');
}

// Set weekly days in the right order
$post['weekly_day'] = array_intersect($sorted_weekly_day, $post['weekly_day']);

// Create a new DateTime object (again)
$date = new \DateTime($appointment_start_date);

$i = 0;

while ($i<=$recurrence_end_after) {
    foreach ($post['weekly_day'] as $weekly_day) {
        if ($i > $recurrence_end_after) {
            break;
        }
        // Modify the date it contains
        $date->modify('next ' . $weekly_day);

        // Output
        $appointment_start_date = $date->format('Y-m-d');
        $all_appointments[] = [
            'appointment_date' => $appointment_start_date
        ];
        $i++;
    }
}

相关问题