CronExpression::getRunDate()protectedWC 1.0

Get the next or previous run date of the expression relative to a date

Метод класса: CronExpression{}

Хуков нет.

Возвращает

DateTime.

Использование

// protected - в коде основоного (родительского) или дочернего класса
$result = $this->getRunDate( $currentTime, $nth, $invert, $allowCurrentDate );
$currentTime(строка|DateTime)
(optional) Relative calculation date
По умолчанию: null
$nth(int)
(optional) Number of matches to skip before returning
$invert(true|false)
(optional) Set to TRUE to go backwards in time
По умолчанию: false
$allowCurrentDate(true|false)
(optional) Set to TRUE to return the
php current date if it matches the cron expression
По умолчанию: false

Код CronExpression::getRunDate() WC 9.3.3

protected function getRunDate($currentTime = null, $nth = 0, $invert = false, $allowCurrentDate = false)
{
    if ($currentTime instanceof DateTime) {
        $currentDate = $currentTime;
    } else {
        $currentDate = new DateTime($currentTime ? $currentTime : 'now');
        $currentDate->setTimezone(new DateTimeZone(date_default_timezone_get()));
    }

    $currentDate->setTime($currentDate->format('H'), $currentDate->format('i'), 0);
    $nextRun = clone $currentDate;
    $nth = (int) $nth;

    // Set a hard limit to bail on an impossible date
    for ($i = 0; $i < 1000; $i++) {

        foreach (self::$order as $position) {
            $part = $this->getExpression($position);
            if (null === $part) {
                continue;
            }

            $satisfied = false;
            // Get the field object used to validate this part
            $field = $this->fieldFactory->getField($position);
            // Check if this is singular or a list
            if (strpos($part, ',') === false) {
                $satisfied = $field->isSatisfiedBy($nextRun, $part);
            } else {
                foreach (array_map('trim', explode(',', $part)) as $listPart) {
                    if ($field->isSatisfiedBy($nextRun, $listPart)) {
                        $satisfied = true;
                        break;
                    }
                }
            }

            // If the field is not satisfied, then start over
            if (!$satisfied) {
                $field->increment($nextRun, $invert);
                continue 2;
            }
        }

        // Skip this match if needed
        if ((!$allowCurrentDate && $nextRun == $currentDate) || --$nth > -1) {
            $this->fieldFactory->getField(0)->increment($nextRun, $invert);
            continue;
        }

        return $nextRun;
    }

    // @codeCoverageIgnoreStart
    throw new RuntimeException('Impossible CRON expression');
    // @codeCoverageIgnoreEnd
}