Вход Регистрация
Файл: gapps/vendor/mtdowling/cron-expression/src/Cron/DayOfWeekField.php
Строк: 117
<?php

namespace Cron;

use 
DateTime;
use 
InvalidArgumentException;


/**
 * Day of week field.  Allows: * / , - ? L #
 *
 * Days of the week can be represented as a number 0-7 (0|7 = Sunday)
 * or as a three letter string: SUN, MON, TUE, WED, THU, FRI, SAT.
 *
 * 'L' stands for "last". It allows you to specify constructs such as
 * "the last Friday" of a given month.
 *
 * '#' is allowed for the day-of-week field, and must be followed by a
 * number between one and five. It allows you to specify constructs such as
 * "the second Friday" of a given month.
 */
class DayOfWeekField extends AbstractField
{
    public function 
isSatisfiedBy(DateTime $date, $value)
    {
        if (
$value == '?') {
            return 
true;
        }

        
// Convert text day of the week values to integers
        
$value = $this->convertLiterals($value);

        
$currentYear = $date->format('Y');
        
$currentMonth = $date->format('m');
        
$lastDayOfMonth = $date->format('t');

        
// Find out if this is the last specific weekday of the month
        
if (strpos($value, 'L')) {
            
$weekday = str_replace('7', '0', substr($value, 0, strpos($value, 'L')));
            
$tdate = clone $date;
            
$tdate->setDate($currentYear, $currentMonth, $lastDayOfMonth);
            while (
$tdate->format('w') != $weekday) {
                
$tdateClone = new DateTime();
                
$tdate = $tdateClone
                    
->setTimezone($tdate->getTimezone())
                    ->
setDate($currentYear, $currentMonth, --$lastDayOfMonth);
            }

            return 
$date->format('j') == $lastDayOfMonth;
        }

        
// Handle # hash tokens
        
if (strpos($value, '#')) {
            list(
$weekday, $nth) = explode('#', $value);

            
// 0 and 7 are both Sunday, however 7 matches date('N') format ISO-8601
            
if ($weekday === '0') {
                
$weekday = 7;
            }

            
// Validate the hash fields
            
if ($weekday < 0 || $weekday > 7) {
                throw new 
InvalidArgumentException("Weekday must be a value between 0 and 7. {$weekday} given");
            }
            if (
$nth > 5) {
                throw new 
InvalidArgumentException('There are never more than 5 of a given weekday in a month');
            }
            
// The current weekday must match the targeted weekday to proceed
            
if ($date->format('N') != $weekday) {
                return 
false;
            }

            
$tdate = clone $date;
            
$tdate->setDate($currentYear, $currentMonth, 1);
            
$dayCount = 0;
            
$currentDay = 1;
            while (
$currentDay < $lastDayOfMonth + 1) {
                if (
$tdate->format('N') == $weekday) {
                    if (++
$dayCount >= $nth) {
                        break;
                    }
                }
                
$tdate->setDate($currentYear, $currentMonth, ++$currentDay);
            }

            return 
$date->format('j') == $currentDay;
        }

        
// Handle day of the week values
        
if (strpos($value, '-')) {
            
$parts = explode('-', $value);
            if (
$parts[0] == '7') {
                
$parts[0] = '0';
            } elseif (
$parts[1] == '0') {
                
$parts[1] = '7';
            }
            
$value = implode('-', $parts);
        }

        
// Test to see which Sunday to use -- 0 == 7 == Sunday
        
$format = in_array(7, str_split($value)) ? 'N' : 'w';
        
$fieldValue = $date->format($format);

        return 
$this->isSatisfied($fieldValue, $value);
    }

    public function 
increment(DateTime $date, $invert = false)
    {
        if (
$invert) {
            
$date->modify('-1 day');
            
$date->setTime(23, 59, 0);
        } else {
            
$date->modify('+1 day');
            
$date->setTime(0, 0, 0);
        }

        return 
$this;
    }

    public function 
validate($value)
    {
        
$value = $this->convertLiterals($value);

        foreach (
explode(',', $value) as $expr) {
            if (!
preg_match('/^(*|[0-7](L?|#[1-5]))([/,-][0-7]+)*$/', $expr)) {
                return 
false;
            }
        }

        return 
true;
    }

    private function 
convertLiterals($string)
    {
        return 
str_ireplace(
            array(
'SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'),
            
range(0, 6),
            
$string
        
);
    }
}
Онлайн: 1
Реклама