modify('+1 minute'); $check->setTime((int) $check->format('H'), (int) $check->format('i'), 0); $maxIterations = 400 * 24 * 60; for ($i = 0; $i < $maxIterations; $i++) { $m = (int) $check->format('i'); $h = (int) $check->format('G'); $d = (int) $check->format('j'); $mo = (int) $check->format('n'); $dow = (int) $check->format('w'); // 0=Sunday $matchMinute = ($cronMinute === '*' || (is_numeric($cronMinute) && $m === (int) $cronMinute)); $matchHour = ($cronHour === '*' || (is_numeric($cronHour) && $h === (int) $cronHour)); $matchDay = ($cronDay === '*' || (is_numeric($cronDay) && $d === (int) $cronDay)); $matchMonth = ($cronMonth === '*' || (is_numeric($cronMonth) && $mo === (int) $cronMonth)); $matchWeekday = ($cronWeekday === '*'); if (!$matchWeekday) { if (str_contains($cronWeekday, '-')) { $range = explode('-', $cronWeekday); if (count($range) === 2 && is_numeric($range[0]) && is_numeric($range[1])) { $matchWeekday = ($dow >= (int) $range[0] && $dow <= (int) $range[1]); } } elseif (is_numeric($cronWeekday)) { $matchWeekday = ($dow === (int) $cronWeekday); } } if ($matchMinute && $matchHour && $matchDay && $matchMonth && $matchWeekday) { return $check; } $check->modify('+1 minute'); } // Fallback return new DateTime('+1 day', new DateTimeZone('UTC')); }