<?php
namespace Cron;
if (!defined('ABSPATH')) exit;
use DateTime;
use DateTimeZone;
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);
 }
}
