1*37748cd8SNickeau<?php 2*37748cd8SNickeau 3*37748cd8SNickeaunamespace Cron; 4*37748cd8SNickeauuse DateTime; 5*37748cd8SNickeauuse DateTimeZone; 6*37748cd8SNickeau 7*37748cd8SNickeau 8*37748cd8SNickeau/** 9*37748cd8SNickeau * Hours field. Allows: * , / - 10*37748cd8SNickeau */ 11*37748cd8SNickeauclass HoursField extends AbstractField 12*37748cd8SNickeau{ 13*37748cd8SNickeau public function isSatisfiedBy(DateTime $date, $value) 14*37748cd8SNickeau { 15*37748cd8SNickeau return $this->isSatisfied($date->format('H'), $value); 16*37748cd8SNickeau } 17*37748cd8SNickeau 18*37748cd8SNickeau public function increment(DateTime $date, $invert = false, $parts = null) 19*37748cd8SNickeau { 20*37748cd8SNickeau // Change timezone to UTC temporarily. This will 21*37748cd8SNickeau // allow us to go back or forwards and hour even 22*37748cd8SNickeau // if DST will be changed between the hours. 23*37748cd8SNickeau if (is_null($parts) || $parts == '*') { 24*37748cd8SNickeau $timezone = $date->getTimezone(); 25*37748cd8SNickeau $date->setTimezone(new DateTimeZone('UTC')); 26*37748cd8SNickeau if ($invert) { 27*37748cd8SNickeau $date->modify('-1 hour'); 28*37748cd8SNickeau } else { 29*37748cd8SNickeau $date->modify('+1 hour'); 30*37748cd8SNickeau } 31*37748cd8SNickeau $date->setTimezone($timezone); 32*37748cd8SNickeau 33*37748cd8SNickeau $date->setTime($date->format('H'), $invert ? 59 : 0); 34*37748cd8SNickeau return $this; 35*37748cd8SNickeau } 36*37748cd8SNickeau 37*37748cd8SNickeau $parts = strpos($parts, ',') !== false ? explode(',', $parts) : array($parts); 38*37748cd8SNickeau $hours = array(); 39*37748cd8SNickeau foreach ($parts as $part) { 40*37748cd8SNickeau $hours = array_merge($hours, $this->getRangeForExpression($part, 23)); 41*37748cd8SNickeau } 42*37748cd8SNickeau 43*37748cd8SNickeau $current_hour = $date->format('H'); 44*37748cd8SNickeau $position = $invert ? count($hours) - 1 : 0; 45*37748cd8SNickeau if (count($hours) > 1) { 46*37748cd8SNickeau for ($i = 0; $i < count($hours) - 1; $i++) { 47*37748cd8SNickeau if ((!$invert && $current_hour >= $hours[$i] && $current_hour < $hours[$i + 1]) || 48*37748cd8SNickeau ($invert && $current_hour > $hours[$i] && $current_hour <= $hours[$i + 1])) { 49*37748cd8SNickeau $position = $invert ? $i : $i + 1; 50*37748cd8SNickeau break; 51*37748cd8SNickeau } 52*37748cd8SNickeau } 53*37748cd8SNickeau } 54*37748cd8SNickeau 55*37748cd8SNickeau $hour = $hours[$position]; 56*37748cd8SNickeau if ((!$invert && $date->format('H') >= $hour) || ($invert && $date->format('H') <= $hour)) { 57*37748cd8SNickeau $date->modify(($invert ? '-' : '+') . '1 day'); 58*37748cd8SNickeau $date->setTime($invert ? 23 : 0, $invert ? 59 : 0); 59*37748cd8SNickeau } 60*37748cd8SNickeau else { 61*37748cd8SNickeau $date->setTime($hour, $invert ? 59 : 0); 62*37748cd8SNickeau } 63*37748cd8SNickeau 64*37748cd8SNickeau return $this; 65*37748cd8SNickeau } 66*37748cd8SNickeau 67*37748cd8SNickeau public function validate($value) 68*37748cd8SNickeau { 69*37748cd8SNickeau return (bool) preg_match('/^[\*,\/\-0-9]+$/', $value); 70*37748cd8SNickeau } 71*37748cd8SNickeau} 72