date_diff
Возвращает разницу между двумя объектами DateTimeInterface .
Список параметров
Дата и время для сравнения.
Используется, чтобы вернуть абсолютную разницу.
Возвращаемые значения
DateInterval объект представляет разницу между двумя датами.
Возвращаемое значение более конкретно представляет временной интервал для применения к исходному объекту ( $this или $originObject ), чтобы прийти к $targetObject . Этот процесс не всегда обратим.
Метод учитывает смену часовых поясов и поэтому может возвращать интервал 24 hours and 30 minutes , как в одном из примеров. Если вы хотите рассчитывать по абсолютному времени, вам необходимо сначала преобразовать $this / $baseObject и $targetObject в UTC.
Примеры
Пример #1 Пример использования DateTimeImmutable::diff()
$origin = new DateTimeImmutable ( ‘2009-10-11’ );
$target = new DateTimeImmutable ( ‘2009-10-13’ );
$interval = $origin -> diff ( $target );
echo $interval -> format ( ‘%R%a дней’ );
?>?php
$origin = date_create ( ‘2009-10-11’ );
$target = date_create ( ‘2009-10-13’ );
$interval = date_diff ( $origin , $target );
echo $interval -> format ( ‘%R%a дней’ );
?>?php
Результат выполнения данных примеров:
+2 days
Пример #2 Пример использования DateTimeInterface::diff() во время перехода на летнее время
$originalTime = new DateTimeImmutable ( «2021-10-30 09:00:00 Europe/London» );
$targedTime = new DateTimeImmutable ( «2021-10-31 08:30:00 Europe/London» );
$interval = $originalTime -> diff ( $targedTime );
echo $interval -> format ( «%H:%I:%S (Полных дней: %a)» ), «\n» ;
?>?php
Результат выполнения данного примера:
24:30:00 (Полных дней: 0)
Пример #3 Сравнение объектов DateTime
$date1 = new DateTime ( «now» );
$date2 = new DateTime ( «tomorrow» );
?php
var_dump ( $date1 == $date2 );
var_dump ( $date1 < $date2 );
var_dump ( $date1 > $date2 );
?>
Результат выполнения данного примера:
bool(false) bool(true) bool(false)
Смотрите также
- DateInterval::format() — Форматирует интервал
- DateTime::add() — Изменяет объект DateTime, добавляя количество дней, месяцев, лет, часов, минут и секунд
- DateTime::sub() — Изменяет указанный объект DateTime, вычитая указанный объект DateInterval.
User Contributed Notes
There are no user contributed notes for this page.
- Copyright © 2001-2023 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
Как применять операторы сравнения к дате php
Объявления скалярных типов введена в двух вариантах: принудительный (по умолчанию) и строгий. Следующие типы могут использоваться для объявления параметров (в обоих вариантах): строки ( string ), целые ( int ), числа с плавающей точкой ( float ) и логические значения ( bool ). Они дополняют аргументы других типов, введённых в PHP 5: имена классов, интерфейсов, array и callable .
// Принудительный режим
function sumOfInts ( int . $ints )
return array_sum ( $ints );
>
?php
var_dump ( sumOfInts ( 2 , ‘3’ , 4.1 ));
Результат выполнения данного примера:
int(9)
Для установки строгого режима, в самом начале файла необходимо поместить одну директиву declare . Это означает, что строгость объявления скалярных типов работает на уровне файла и не затрагивает весь остальной код. Эта директива затрагивает не только объявления параметров, но и возвращаемые значения функций (смотрите объявления возвращаемого типа), встроенные функции PHP и функции загруженных модулей.
Подробную документацию и примеры использования читайте в разделе декларация типов.
Объявления возвращаемых значений
В PHP 7 добавлена поддержка объявления возвращаемого типа. Аналогично как и объявления типов аргументов, объявление типа возвращаемого значения указывает, значение какого типа должна вернуть функция. Для объявления типа возвращаемого значения доступны все те же типы, что и для объявления типов аргументов.
function arraysSum (array . $arrays ): array
return array_map (function(array $array ): int return array_sum ( $array );
>, $arrays );
>
print_r ( arraysSum ([ 1 , 2 , 3 ], [ 4 , 5 , 6 ], [ 7 , 8 , 9 ]));
Результат выполнения данного примера:
Array ( [0] => 6 [1] => 15 [2] => 24 )
Полную документацию и примеры использования читайте в разделе про объявление возвращаемого типа.
Оператор объединения с null
Был добавлен оператор объединения с null ( ?? ), являющийся синтаксическим сахаром для достаточно распространённого действия, когда совместно используются тернарный оператор и функция isset() . Он возвращает первый операнд, если он задан и не равен null , а в обратном случае возвращает второй операнд.
// Извлекаем значение $_GET[‘user’], а если оно не задано,
// то возвращаем ‘nobody’
$username = $_GET [ ‘user’ ] ?? ‘nobody’ ;
// Это идентично следующему коду:
$username = isset( $_GET [ ‘user’ ]) ? $_GET [ ‘user’ ] : ‘nobody’ ;
?php
// Данный оператор можно использовать в цепочке.
// В этом примере мы сперва проверяем, задан ли $_GET[‘user’], если нет,
// то проверяем $_POST[‘user’], и если он тоже не задан, то присваеваем ‘nobody’.
$username = $_GET [ ‘user’ ] ?? $_POST [ ‘user’ ] ?? ‘nobody’ ;
?>
Оператор spaceship (космический корабль)
Этот оператор предназначен для сравнения двух выражений. Он возвращает -1, 0 или 1 если $a , соответственно, меньше, равно или больше чем $b . Сравнение производится в соответствии с правилами сравнения типов PHP.
// Целые числа
echo 1 1 ; // 0
echo 1 2 ; // -1
echo 2 1 ; // 1
?php
// Числа с плавающей точкой
echo 1.5 1.5 ; // 0
echo 1.5 2.5 ; // -1
echo 2.5 1.5 ; // 1
// Строки
echo «a» «a» ; // 0
echo «a» «b» ; // -1
echo «b» «a» ; // 1
?>
Определение констант массивов с помощью define()
Можно определить константу типа array с помощью функции define() . В PHP 5.6 такие константы можно было задавать только с помощью const .
echo ANIMALS [ 1 ]; // выводит «cat»
?>
Анонимные классы
Была добавлена поддержка анонимных классов с помощью new class . Их можно использовать тогда, когда нужен одноразовый класс и создавать полноценный класс, а потом его объект не имеет смысла:
interface Logger public function log ( string $msg );
>
?php
class Application private $logger ;
public function getLogger (): Logger return $this -> logger ;
>
public function setLogger ( Logger $logger ) $this -> logger = $logger ;
>
>
$app = new Application ;
$app -> setLogger (new class implements Logger public function log ( string $msg ) echo $msg ;
>
>);
var_dump ( $app -> getLogger ());
?>
Результат выполнения данного примера:
object(class@anonymous)#2 (0)
Подробную документацию и примеры использования читайте в разделе про анонимные классы.
Синтаксис кодирования Unicode
Он принимает шестнадцатеричный код Unicode и записываем его в формате UTF-8 в двойных кавычках или формате heredoc. Любой корректный код будет принят. Ведущие нули по желанию.
echo «\u
echo «\u»;
echo «\u»;
Результат выполнения данного примера:
ª ª (То же самое, что и первый вариант, но с ведущими нулями) 香
Closure::call()
Closure::call() является более производительным и коротким способом временного связывания области действия объекта с замыканием и его вызовом.
// До PHP 7
$getX = function() x ;>;
$getXCB = $getX -> bindTo (new A , ‘A’ ); // промежуточное замыкание
echo $getXCB ();
// PHP 7+
$getX = function() x ;>;
echo $getX -> call (new A );
Результат выполнения данного примера:
unserialize() с фильтрацией
Эта функциональность обеспечивает более высокий уровень безопасности при десериализации объектов с непроверенными данными. Это позволяет предотвратить возможную инъекцию кода, позволяя разработчику использовать белый список классов для десериализации.
// Преобразование всех объектов в __PHP_Incomplete_Class
$data = unserialize ( $foo , [ «allowed_classes» => false ]);
// Преобразование всех объектов, кроме MyClass и MyClass2 в __PHP_Incomplete_Class
$data = unserialize ( $foo , [ «allowed_classes» => [ «MyClass» , «MyClass2» ]]);
// Поведение по умолчанию принимает все классы (можно просто не задавать второй аргумент)
$data = unserialize ( $foo , [ «allowed_classes» => true ]);
IntlChar
Новый класс IntlChar добавляет новую функциональность в ICU. Класс определяет несколько статических методов и констант для манипулирования символами Unicode.
printf ( ‘%x’ , IntlChar :: CODEPOINT_MAX );
echo IntlChar :: charName ( ‘@’ );
var_dump ( IntlChar :: ispunct ( ‘!’ ));
Результат выполнения данного примера:
10ffff COMMERCIAL AT bool(true)
Для использования это класса необходимо установить модуль Intl.
Ожидания
Ожидания являются улучшенной, обратно совместимой версией старой функции assert() . Они позволяют делать предположения с нулевой стоимостью в промышленном коде и предоставляют возможность выбрасывать пользовательские исключения в случае провала ожидания.
Вместе тем, что старое API поддерживается, assert() теперь является языковой конструкцией, принимающей первым аргументом выражения, а не только строки ( string ) для оценки или логические значения ( bool ) для проверки.
class CustomError extends AssertionError <>
assert ( false , new CustomError ( ‘Сообщение об ошибке’ ));
?>
Результат выполнения данного примера:
Fatal error: Uncaught CustomError: Сообщение об ошибке
Подробное описание этого функционала, а также инструкции для его конфигурирования для тестовых и промышленных сред, можно найти на странице руководства, посвящённой функции assert() .
Групповые объявления use
Классы, функции и константы импортируемые из одного и того же namespace , теперь можно группировать в одном операторе use .
// До PHP 7
use some\namespace\ClassA ;
use some\namespace\ClassB ;
use some\namespace\ClassC as C ;
?php
use function some\namespace\fn_a ;
use function some\namespace\fn_b ;
use function some\namespace\fn_c ;
use const some\namespace\ConstA ;
use const some\namespace\ConstB ;
use const some\namespace\ConstC ;
Выражение return в генераторах
Эта функциональность добавлена к генераторам, введённым в PHP 5.5. Она позволяет использовать оператор return в генераторах в качестве окончательного возвращаемого значения (возврат по ссылке недопустим). Это значение можно извлечь с помощью нового метода Generator::getReturn() , который можно использовать только после того, как генератор вернул все сгенерированные значение.
$gen = (function() yield 1 ;
yield 2 ;
foreach ( $gen as $val ) echo $val , PHP_EOL ;
>
echo $gen -> getReturn (), PHP_EOL ;
Результат выполнения данного примера:
1 2 3
Возможность явно получать окончательное значение генератора является очень полезной, так как позволяет клиентскому коду, использующему генератор, получать и обработать самое последнее значение генератора, после которого точно ничего больше не будет. Это сильно проще, чем вынуждать разработчика проверять, последнее ли значение вернулось и как-то по особенному его обрабатывать.
Делегация генератора
Теперь генератор может автоматически делегировать другому генератору, объекту класса, реализующий Traversable или массиву без необходимости писать в нем дополнительную обработку полученных значений. Достигается это с помощью конструкции yield from .
function gen2 ()
yield 3 ;
yield 4 ;
>
foreach ( gen () as $val )
echo $val , PHP_EOL ;
>
?>
Результат выполнения данного примера:
1 2 3 4
Функция целочисленного деления intdiv()
Новая функция intdiv() производит целочисленное деление операндов и возвращает его результат.
var_dump ( intdiv ( 10 , 3 ));
?>?php
Результат выполнения данного примера:
int(3)
Опции сессий
Теперь session_start() принимает массив опций, которые переопределят конфигурационные директивы сессии установленные в php.ini.
Также опции были расширены включённой по умолчанию опцией session.lazy_write, которая говорит PHP о том, что файл сессии надо перезаписывать, только если изменились данные сессии, и опцией read_and_close , которую можно задать только через session_start() для того, чтобы PHP закрывал сессию сразу же как прочитает её данные и не вносил в неё каких-либо изменений.
К примеру, для установки session.cache_limiter равным private и немедленному закрытию сессии после чтения её данных:
session_start ([
‘cache_limiter’ => ‘private’ ,
‘read_and_close’ => true ,
]);
?>?php
preg_replace_callback_array()
Новая функция preg_replace_callback_array() позволяет писать более чистый код, когда требуется использовать функцию preg_replace_callback() . До PHP 7 при необходимости обработать разные регулярные выражения разными функциями приходилось для каждой такой обработки писать отдельный вызов функции.
Теперь можно использовать одну функцию, передавая в неё ассоциативный массив, ключами которого являются регулярные выражения, а значениями — функции обратного вызова.
Функции CSPRNG
Были добавлены две новые кроссплатформенные функции для генерации криптографически безопасных строк и целых чисел: random_bytes() и random_int() .
Теперь функция list() всегда может распаковывать объекты, реализующие ArrayAccess
Ранее функция list() не гарантировала корректную обработку объектов, реализующих ArrayAccess . Теперь это исправлено.
Прочие изменения
- Добавлена возможность доступа к методам и свойствам класса при клонировании, то есть (clone $foo)->bar() .
Сравнение дат в PHP с помощью функции StrToTime ()
В PHP можно легко создать удобочитаемую дату или время, используя функцию Date() . Эта функция принимает два аргумента: допустимый формат даты и метку времени Unix ( если ее не указывать, функция возвратит текущую дату/время ).
Пример
$right_now = date("Y-m-d H:i:s"); //Это вернет текущие //дату и время в указанном формате echo "" . $right_now . "
";
Приведенный выше пример прекрасно подходит для отображения дат и времени. Но когда дело доходит до PHP сравнения дат, использовать удобные для чтения строки — не самый надежный способ. Намного эффективнее сравнить временные метки. Метка времени Unix содержит количество секунд между 1 января 1970 00:00:00 GMT и указанным временем. Это означает, что можно сравнивать даты вплоть до секунд.
Чтобы использовать функцию date() для возврата конкретной даты необходима метка времени, так что сначала потребуется создать ее. Это можно сделать с помощью функций mktime() или strotime() . Обе функции возвращают метку времени Unix , но при этом принимают различные аргументы.
Функция mktime() требует, чтобы дата и время были переданы ей в виде отдельных сегментов ( часы, минуты, секунды, месяц, день, год ):
$timestamp1 = mktime(16, 00, 15, 1, 5, 2016); //Возвращает: 2016-01-05 16:00:15 echo "" . date( 'Y-m-d H:i:s' , $timestamp1) . "
";
В свою очередь функция strtotime() может преобразовать текстовое представление даты/времени в метку времени:
$timestamp2 = strtotime("2016-01-05 16:00:15"); //Возвращает: 2016-01-05 16:00:15 echo "" . date( 'Y-m-d H:i:s' , $timestamp2) . "
";
Если при PHP сравнении даты с текущей функция strtotime() получает дату/время, в которых день и месяц располагаются перед годом, эта запись будет интерпретироваться по-разному, в зависимости от используемого разделителя. При использовании косой черты в качестве разделителя функция возвратит метку времени в американском формате ( м/д/г ). При использовании в качестве разделителя тире или точки функция возвратит метку в европейском формате ( д-м-г ).
Как можно увидеть ниже, первая метка времени отличается от двух последних:
$american_format = strtotime('05/01/2016'); //Дает нам: 1462053600 echo "" . $american_format . "
"; $european_format1 = strtotime('05-01-2016'); //Дает нам: 1451948400 echo "" . $european_format1 . "
"; $european_format2 = strtotime('05.01.2016'); //Дает нам: 1451948400 echo "" . $european_format2 . "
";
Функции mktime() и strtotime() возвращают одинаковый результат. Часто текстовое представление даты и времени (‘ 2016-01-01 ‘) хранится в базе данных и считывается из нее через HTML-форму . Например, при помощи библиотеки jQuery datepicker, которая идеально подходит для использования функции strtotime() .
Прежде чем осуществлять сравнение двух дат в PHP , важно убедиться, что временные метки созданы с помощью одного и того же формата. Можно воспользоваться функцией mktime() . Ее преимущество заключается в том, что она намного строже в отношении передаваемой ей даты или время.
Важным преимуществом использования функции strtotime() является гибкость и простота, с которой можно добавить время или вычесть из него:
//Это вернет текущую дату плюс 1 неделю $timestamp3 = strtotime("+1 week"); echo "" . date( 'Y-m-d' , $timestamp3) . "
"; //Это вернет определенную дата/время //плюс одну неделю('2016-01-12 16:00:15') $timestamp4 = strtotime("+1 week", strtotime('2016-01-05 16:00:15')); echo "" . date( 'Y-m-d H:i:s' , $timestamp4) . "
"; //Использование mktime() для создания временной метки //вернет то же. Что и выше ('2016-01-12 16:00:15') $mktime = mktime(16, 00, 15, 1, 5, 2016); $timestamp5 = strtotime("+1 week", $mktime); echo "" . date( 'Y-m-d H:i:s' , $timestamp5) . "
";
Пример, показанный ниже, демонстрирует PHP сравнение даты и операции с использованием функции strtotime() . В нем создается массив дат в заданном диапазоне в соответствии с определенным временным интервалом. Функция print_r() выводит результирующий массив, который выглядит следующим образом:
Array ( [0] => 2016-01-08 [1] => 2016-01-15 [2] => 2016-01-22 [3] => 2016-01-29 [4] => 2016-02-05 [5] => 2016-02-12 [6] => 2016-02-19 [7] => 2016-02-26 [8] => 2016-03-04 [9] => 2016-03-11 [10] => 2016-03-18 [11] => 2016-03-25 )
При сравнении двух дат в PHP внутри цикла while время ( в данном случае семь дней ) добавляется к дате начала и производится проверка, чтобы убедиться больше ли полученная временная метка, чем временная метка даты начала.
Если это не так, новая дата добавляется в массив $DateRange , пока цикл не закончится:
$startDate = '2016-01-01'; $endDate = '2016-03-31'; $dateRange = array(); $start = strtotime($startDate); $end = strtotime($endDate); $interval = 'weekly'; switch($interval) < case 'weekly': $str = '7 day'; break; case '4_weekly': $str = '4 Weeks'; break; case 'monthly': $str = '1 month'; break; case 'annually': $str = '1 year'; break; >//заполнение массива диапазоном дат while ($start >
Я использовал оператор switch , чтобы определить несколько различных вариантов временного интервала. Это было сделано для того, чтобы показать, как интуитивные « временные » строки использовались для управления временной меткой с помощью функции strtotime() . В документации по PHP приводятся дополнительные примеры.
ВЛ Виктория Лебедева автор-переводчик статьи « Compare Date and Time With PHP strtotime() | Quick Reference Tutorial »
Работа со временем в php: сравнение и формат вывода
При работе с датами и временем в php могут возникнуть сложности даже у опытных программистов. Для разработки сложных приложений или сайтов чаще всего требуется операции по сравнению времени, изменению его формата или сложению/вычитанию дат и часов.
Напомню, что проще всего получить текущую дату в php можно с помощью функции date(). Например, выведет время и текущую дату.
Преобразовать формат времени
Как известно, в базе данных дата обычно записывается в формате: yyyy-mm-dd. Но при выгрузке на сайте данный формат не очень удобен для восприятия. Предлагаю рассмотреть пример ниже, который преобразует дату в нужный формат (dd-mm-yyyy):
$originalDate = «2010-03-21»;
$newDate = date(«d-m-Y», strtotime($originalDate));
?>
Изменение времени в php
Для этой задачи можно использовать date() и strtotime(). Последняя преобразует дату с 1970г (в виде цифр или английского текста) в метку времени Unix. Рассмотрим примеры:
Прибавит к текущей дате 1 день:
echo date(‘d.m.Y’, strtotime(date(‘d.m.Y’).»+1 day»));
Вычтет 2 часа, 15 минут, 10 сек:
$date=date(«12:57:34»);
$vr = ‘-2 hours -15 minutes -10 seconds’;
echo date(‘H:i:s’, strtotime($date . $vr));
Прибавит 1 недели и 2 дня и вычтет 15 минут:
$date=date(«01.08.2014 12:57:34»);
$vr = ‘+1 week +2 days -15 minutes’;
echo date(‘d.m.Y H:i:s’, strtotime($date . $vr));
Последний день месяца из даты:
$timelastday = date(«t», strtotime(date(«d.m.Y»)));
Текущий день из даты:
$timefirstday = date(«d», strtotime(date(«d.m.Y»)));
Увеличиваем дату на 1 месяц и выводим ее в нужном формате:
$timenext = strtotime(date(«d.m.Y»).» +1 month»);
echo $timenextmec = date(«d.m.Y», $timenext);
Сравнение времени в php
Выполняется на уже знакомой нам функции strtotime(). Рассчитаем разницу в днях между двумя датами:
$date1=’16.11.2012′; $date2=’11.10.2012′;
echo round((strtotime($date1)-strtotime($date2))/(60*60*24));
В php есть множество возможностей по работе с датами и временем. Экспериментируйте с кодом и все получится.
