Php if интервал дат

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 содержит в себе только конструктор и два открытых метода.

  1. staticcreateFromDateString — создает объект DateInterval из строки относительного формата времени
  2. 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 содержит в себе только конструктор и два открытых метода.

  1. staticcreateFromDateString — создает объект DateInterval из строки относительного формата времени
  2. 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));

Источник

Читайте также:  Php preg match multiline
Оцените статью