monthlyByDay((int) $anchor, (bool) $lastDay, (int) $reference, (bool) $inclusive); default: return null; } } private function monthlyByDay($anchor, $lastDay, $reference, $inclusive) { $anchorDay = (int) date('j', $anchor); $h = (int) date('G', $anchor); $i = (int) date('i', $anchor); $s = (int) date('s', $anchor); $y = (int) date('Y', $reference); $m = (int) date('n', $reference); for ($k = 0; $k < self::MAX_MONTHS; $k++) { $lastDom = (int) date('t', mktime(0, 0, 0, $m, 1, $y)); $day = $lastDay ? $lastDom : min($anchorDay, $lastDom); $occurrence = mktime($h, $i, $s, $m, $day, $y); if ($inclusive ? $occurrence >= $reference : $occurrence > $reference) { return $occurrence; } $m++; if ($m > 12) { $m = 1; $y++; } } return null; } }