nginxsonarrradarrplexorganizrdashboardapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmark
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.2 KiB
72 lines
2.2 KiB
7 years ago
|
<?php
|
||
|
|
||
|
namespace Cron;
|
||
|
use DateTime;
|
||
|
use DateTimeZone;
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Hours field. Allows: * , / -
|
||
|
*/
|
||
|
class HoursField extends AbstractField
|
||
|
{
|
||
|
public function isSatisfiedBy(DateTime $date, $value)
|
||
|
{
|
||
|
return $this->isSatisfied($date->format('H'), $value);
|
||
|
}
|
||
|
|
||
|
public function increment(DateTime $date, $invert = false, $parts = null)
|
||
|
{
|
||
|
// Change timezone to UTC temporarily. This will
|
||
|
// allow us to go back or forwards and hour even
|
||
|
// if DST will be changed between the hours.
|
||
|
if (is_null($parts) || $parts == '*') {
|
||
|
$timezone = $date->getTimezone();
|
||
|
$date->setTimezone(new DateTimeZone('UTC'));
|
||
|
if ($invert) {
|
||
|
$date->modify('-1 hour');
|
||
|
} else {
|
||
|
$date->modify('+1 hour');
|
||
|
}
|
||
|
$date->setTimezone($timezone);
|
||
|
|
||
|
$date->setTime($date->format('H'), $invert ? 59 : 0);
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
$parts = strpos($parts, ',') !== false ? explode(',', $parts) : array($parts);
|
||
|
$hours = array();
|
||
|
foreach ($parts as $part) {
|
||
|
$hours = array_merge($hours, $this->getRangeForExpression($part, 23));
|
||
|
}
|
||
|
|
||
|
$current_hour = $date->format('H');
|
||
|
$position = $invert ? count($hours) - 1 : 0;
|
||
|
if (count($hours) > 1) {
|
||
|
for ($i = 0; $i < count($hours) - 1; $i++) {
|
||
|
if ((!$invert && $current_hour >= $hours[$i] && $current_hour < $hours[$i + 1]) ||
|
||
|
($invert && $current_hour > $hours[$i] && $current_hour <= $hours[$i + 1])) {
|
||
|
$position = $invert ? $i : $i + 1;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$hour = $hours[$position];
|
||
|
if ((!$invert && $date->format('H') >= $hour) || ($invert && $date->format('H') <= $hour)) {
|
||
|
$date->modify(($invert ? '-' : '+') . '1 day');
|
||
|
$date->setTime($invert ? 23 : 0, $invert ? 59 : 0);
|
||
|
}
|
||
|
else {
|
||
|
$date->setTime($hour, $invert ? 59 : 0);
|
||
|
}
|
||
|
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
public function validate($value)
|
||
|
{
|
||
|
return (bool) preg_match('/^[\*,\/\-0-9]+$/', $value);
|
||
|
}
|
||
|
}
|