class Interval
{
private $data;
private $timezone;
private $start;
private $end;
public function __construct($serialized, $timezoneName = 'UTC')
{
$this->parse($serialized);
$this->timezone = new DateTimeZone($timezoneName);
$this->makeStart();
$this->makeEnd();
}
public function contains(DateTimeInterface $date)
{
return $date >= $this->start && $date <= $this->end;
}
public function isNow()
{
$now = new DateTimeImmutable('now', $this->timezone);
return $this->contains($now);
}
private function parse($serialized)
{
$parts = explode('-', $serialized);
$this->data = [
'start' => $this->parsePart($parts[0]),
'end' => $this->parsePart($parts[1]),
];
}
private function makeStart()
{
$this->start = $this->makeDate($this->data['start']['hour'], $this->data['start']['minute']);
}
private function makeEnd()
{
$this->end = $this->makeDate($this->data['end']['hour'], $this->data['end']['minute']);
$this->ensureEndIsAfterStart();
}
private function parsePart($part)
{
list($hour, $minute) = explode(':', $part);
return [
'hour' => $hour,
'minute' => $minute,
];
}
private function makeDate($hour, $minute)
{
list($day, $month, $year) = explode('.', date('d.m.Y'));
$date = new DateTime('now', $this->timezone);
$date->setDate($year, $month, $day);
$date->setTime($hour, $minute);
return $date;
}
private function ensureEndIsAfterStart()
{
if ($this->start > $this->end)
{
$this->end->add(new DateInterval('P1D'));
}
}
}
// Примеры использования:
$interval = new Interval('11:59-02:00', 'Europe/Moscow');
var_dump($interval->isNow());
$date = new DateTime('now', new DateTimeZone('Europe/Moscow'));
$date->add(new DateInterval('PT8H'));
var_dump($interval->contains($date));