- Php if интервал дат
- Работа с DateInterval в PHP
- Конструктор DateInterval и Iso 8601
- Анатомия класса DateInterval
- Класс DateInterval
- Обзор классов
- Свойства
- Список изменений
- Php if интервал дат
- Работа с DateInterval в PHP
- Конструктор DateInterval и Iso 8601
- Анатомия класса DateInterval
- Как проверить, входит ли текущее время в заданный диапазон?
Php if интервал дат
Fullstack JavaScript разработчик
Работа с DateInterval в PHP
Подробное рассмотрение встроенного PHP класса DateInterval
DateInterval — представляет собой некую продолжительность времени, которую мы можем использовать при сдвигах даты.
В обычном разговоре, вы ведь вряд-ли скажете «я буду у тебя 2 января 2015 года в 7:38«?
Естественно, вместо этого намного уместнее будет сказать – «я буду у тебя через 10 минут».
Но как объяснить интерпретатору PHP, что значит эта заветная фраза «через 10 минут«?
Именно для таких ситуаций и используется DateInterval.
Рассмотрим элементарный пример использования:
add($dateInterval)->format("d"); echo "послезавтра будет " . $tomorrow . " число"
Конструктор DateInterval и Iso 8601
Вся магия заключается в строке переданной в конструктор — ‘P1D’. Что это за P1D? Согласно стандарту ISO 8601-2004 (или ГОСТ ИСО 8601-2001), P и D являются знаками, использующимся в качестве указателей (designator) (п. 3.4.3 и 4.4 версий стандартов соответственно). Для использования DateInterval понадобится запомнить всего лишь несколько указателей:
Указатель | Расшифровка | Описание |
---|---|---|
P | Period | Начало периода времени |
Y | Year | Год |
M | Month | Месяц |
D | Day | День |
T | Time | Начало представления объекта времени |
H | Hour | Часы |
M | Minute | Минуты |
S | Secunde | Секунды |
Единственный обязательный указатель — P, все остальные опциональны.
Посмотрим на пару примеров:
Любой другой период можно составить по аналогии P
Анатомия класса DateInterval
DateInterval содержит в себе только конструктор и два открытых метода.
- staticcreateFromDateString — создает объект DateInterval из строки относительного формата времени
- format — форматирует интервал для вывода
Также у класса есть открытые члены:
Используя их можно динамически управлять периодом.
Давайте представим, что мы реализуем систему подачи заявок на предзаказ, причем анонимные посетители могут оформить предзаказ только за неделю до появления товара, а зарегистрированные, за три недели.
Предположим что наша система разрабатывается на Yii, в коде это можно было бы выразить так:
user->isGuest) $di->d += 14; $date_to = (new DateTime)->add($di); // получаем все товары с датой выхода между сегодня и $criteria->addBetweenCondition('release_date', $date_from, $date_to); // . code
Таким образом, если выполняется условие !Yii::app()->user->isGuest, т.е. пользователь зарегистрирован, интервал будет увеличен на 14 дней, соответственно зарегистрированный пользователь увидит товары с предзаказом за 21 день перед появлением.
Класс DateInterval
Интервал дат хранит либо определённое фиксированное время (в годах, месяцах, днях, часах и т.д.) или относительную строку времени в формате, поддерживаемом конструктором DateTimeImmutable и DateTime .
Более конкретно, информация в объекте класса DateInterval является инструкцией для перехода от одной даты/времени к другой дате/времени. Этот процесс не всегда обратим.
Распространённым способом создания объекта DateInterval является вычисление разницы между двумя объектами даты/времени с помощью DateTimeInterface::diff() .
Поскольку не существует чётко определённого способа сравнения интервалов дат, экземпляры DateInterval являются несравнимыми.
Обзор классов
Свойства
Доступные свойства, перечисленные ниже, зависят от версии PHP и должны рассматриваться как доступные только для чтения.
Количество микросекунд в виде долей секунды.
Принимает 1 , если интервал представляет отрицательный период времени и 0 в противном случае. Смотрите DateInterval::format() .
Если объект DateInterval создан методом DateTimeImmutable::diff() или DateTime::diff() , то это общее количество полных дней между начальной и конечной датами В противном случае days примет значение false .
Если объект DateInterval был создан методом DateInterval::createFromDateString() , то значение свойства будет true и свойство date_string будет заполнено. В противном случае значение свойства будет false и свойства от y до f , invert и days будут заполнены.
Строка, используемая в качестве аргумента метода DateInterval::createFromDateString() .
Список изменений
Версия | Описание |
---|---|
8.2.0 | Добавлены свойства from_string и date_string для экземпляров DateInterval , которые были созданы с помощью метода DateInterval::createFromDateString() . |
8.2.0 | Будут видны только значения от y до f , invert и days . |
7.4.0 | Экземпляры DateInterval теперь несравнимы; ранее все экземпляры DateInterval считались равными. |
7.1.0 | Добавлено свойство f . |
Php if интервал дат
Fullstack JavaScript разработчик
Работа с DateInterval в PHP
Подробное рассмотрение встроенного PHP класса DateInterval
DateInterval — представляет собой некую продолжительность времени, которую мы можем использовать при сдвигах даты.
В обычном разговоре, вы ведь вряд-ли скажете «я буду у тебя 2 января 2015 года в 7:38«?
Естественно, вместо этого намного уместнее будет сказать – «я буду у тебя через 10 минут».
Но как объяснить интерпретатору PHP, что значит эта заветная фраза «через 10 минут«?
Именно для таких ситуаций и используется DateInterval.
Рассмотрим элементарный пример использования:
add($dateInterval)->format("d"); echo "послезавтра будет " . $tomorrow . " число"
Конструктор DateInterval и Iso 8601
Вся магия заключается в строке переданной в конструктор — ‘P1D’. Что это за P1D? Согласно стандарту ISO 8601-2004 (или ГОСТ ИСО 8601-2001), P и D являются знаками, использующимся в качестве указателей (designator) (п. 3.4.3 и 4.4 версий стандартов соответственно). Для использования DateInterval понадобится запомнить всего лишь несколько указателей:
Указатель | Расшифровка | Описание |
---|---|---|
P | Period | Начало периода времени |
Y | Year | Год |
M | Month | Месяц |
D | Day | День |
T | Time | Начало представления объекта времени |
H | Hour | Часы |
M | Minute | Минуты |
S | Secunde | Секунды |
Единственный обязательный указатель — P, все остальные опциональны.
Посмотрим на пару примеров:
Любой другой период можно составить по аналогии P
Анатомия класса DateInterval
DateInterval содержит в себе только конструктор и два открытых метода.
- staticcreateFromDateString — создает объект DateInterval из строки относительного формата времени
- format — форматирует интервал для вывода
Также у класса есть открытые члены:
Используя их можно динамически управлять периодом.
Давайте представим, что мы реализуем систему подачи заявок на предзаказ, причем анонимные посетители могут оформить предзаказ только за неделю до появления товара, а зарегистрированные, за три недели.
Предположим что наша система разрабатывается на Yii, в коде это можно было бы выразить так:
user->isGuest) $di->d += 14; $date_to = (new DateTime)->add($di); // получаем все товары с датой выхода между сегодня и $criteria->addBetweenCondition('release_date', $date_from, $date_to); // . code
Таким образом, если выполняется условие !Yii::app()->user->isGuest, т.е. пользователь зарегистрирован, интервал будет увеличен на 14 дней, соответственно зарегистрированный пользователь увидит товары с предзаказом за 21 день перед появлением.
Как проверить, входит ли текущее время в заданный диапазон?
Приветствую.
Задача: есть временной диапазон в строковом формате (например 12:00-02:00), есть название текущего дня недели (например Friday) и текущее время (например 14:03), которое меняется при перезагрузке страницы. Как грамотно и без велосипедов проверить текущее время на вхождение в заданный интервал? При этом учесть, что 02:00 это уже время завтрашнего дня. Формат времени — 24-х часовой.
Спасибо.
Алгоритм тут достаточно простой — вам нужно диапазон преобразовать в две даты — начало и конец диапазона.
А потом просто сравнить текущее время с ними.
Разбивка диапазона — операция достаточно простая, попробуйте справиться самостоятельно и если что-то не получится, приходите снова с конкретными вопросами.
Накидал примерное решение из интереса. Рекомендую всё-таки решить задачу самостоятельно и потом сравнить.
$periodString = '12:00-02:00'; $weekDay = 'Friday'; $period = [ 'start' => new DateTime(), 'end' => new DateTime(), ]; $day = (int)date('d', strtotime('this '.$weekDay)); $month = (int)date('m', strtotime('this '.$weekDay)); $year = (int)date('Y', strtotime('this '.$weekDay)); foreach (array_combine(['start', 'end'], explode('-', $periodString)) as $type => $part) < list($hour, $minute) = explode(':', $part); $hour = (int)$hour; $minute = (int)$minute; $date = $period[$type]; $date->setDate($year, $month, $day); $date->setTime($hour, $minute); > if ($period['start'] > $period['end']) < $period['end']->add(new DateInterval('P1D')); > $now = new DateTime(); $isInInterval = $now >= $period['start'] && $now
А можно пойти немного дальше:
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 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));