/** * @param DateTimeInterval $interval * @param \DateTime $date * @return static */ public static function fromDateTimeInterval(DateTimeInterval $interval, \DateTime $date) : SingleDayTimeInterval { $thisDayInterval = self::buildWholeDayInterval($date); /** @var DateTimeInterval $intersection */ $intersection = $thisDayInterval->getIntersection($interval); if ($intersection === NULL) { throw new InvalidArgumentException('Given day does not hits given interval. No intersection possible.'); } $left = SingleDayTime::fromDateTime($intersection->getLeft()->getValue()); $right = SingleDayTime::fromDateTime($intersection->getRight()->getValue()); return new static(new SingleDayTimeBoundary($left, $intersection->getLeft()->getState()), new SingleDayTimeBoundary($right, $intersection->getRight()->getState())); }
/** * @param SingleDayTime $other * @param int $sign -1 (sub) or 1 (add) * @throws ModificationNotPossibleException */ private function addOrSub(SingleDayTime $other, int $sign) { $seconds = $this->seconds; $minutes = $this->minutes; $hours = $this->hours; $seconds += $sign * $other->getSeconds(); $carryMinutes = 0; if ($seconds > 59 || $seconds < 0) { $carryMinutes = 1; $seconds += -$sign * 60; } $minutes += $sign * ($other->getMinutes() + $carryMinutes); $carryHours = 0; if ($minutes > 59 || $minutes < 0) { $carryHours = 1; $minutes += -$sign * 60; } $hours += $sign * ($other->getHours() + $carryHours); $this->validateModification($hours, $sign); $this->seconds = $seconds; $this->minutes = (int) $minutes; $this->hours = (int) $hours; }
/** * @param string $string * @return SingleDayTimeBoundary */ protected static function parseBoundary(string $string) : Boundary { list($elementString, $state) = self::parseBoundaryDataFromString($string); return new SingleDayTimeBoundary(SingleDayTime::from($elementString), $state); }
/** * @param \DateTime|string|int $element * @param bool $state * @return SingleDayTimeBoundary */ public static function create($element, bool $state) : SingleDayTimeBoundary { return new SingleDayTimeBoundary(SingleDayTime::from($element), $state); }