Для работы с датами в PHP есть три пути.
- Использовать обычные функции https://php.net/manual/ru/ref.datetime.php
- Использовать встроенные классы, например, https://php.net/manual/ru/class.datetimeimmutable.php
- Воспользоваться сторонней библиотекой
Первый вариант подходит только для примитивных расчётов. Не потому, что функции плохи, а потому, что в PHP их мало и ими неудобно пользоваться (интерфейс для машин, а не для людей). Встроенные классы тоже не сильно облегчают задачу. Они работают на низком уровне и простые операции в стиле "получить дату, которая была неделю назад" становятся целым приключением.
В этом уроке мы рассмотрим третий вариант. Самым популярным сторонним решением для работы с датами в PHP является библиотека Carbon.
<?php
use Carbon\Carbon;
// выдало текущую дату на момент написания урока
printf("Now: %s", Carbon::now()); // Now: 2018-04-21 13:31:56
В целом принцип работы этой библиотеки совпадает с принципом работы Collect
. Создавая объект, мы как бы "оборачиваем" дату, делая её внутренним состоянием объекта. Затем выполняем необходимые операции, используя соответствующие методы. Когда нам снова понадобится дата, то мы сможем её извлечь.
Библиотека Carbon обширна и включает в себя невероятно большое количество методов. Мы рассмотрим буквально несколько, а за остальными добро пожаловать в официальную документацию.
Определение выходного дня
<?php
if (Carbon::now()->isWeekend()) {
echo 'Party!';
}
// Без Carbon
// if (date('D') === 'Sat' || date('D') === 'Sun') {
// echo "Today is Saturday or Sunday.";
// }
Вывод
<?php
Carbon::create(2001, 4, 21, 12)->diffForHumans(); // 1 month ago
Манипулирование датами
<?php
$nextSummerOlympics = Carbon::createFromDate(2016)->addYears(4);
// date("F j Y", mktime(0, 0, 0, 1, 1, 2016 + 4));
Fluent Setters
Carbon предоставляет текучий интерфейс для генерации дат, причём даже несколько видов таких интерфейсов. Его полезность проявляется в местах, где построение дат — динамическое.
<?php
$dt = Carbon::now();
$dt->year(1975)->month(5)->day(21)->hour(22)->minute(32)->second(5)->toDateTimeString();
$dt->setDate(1975, 5, 21)->setTime(22, 32, 5)->toDateTimeString();
$dt->setDate(1975, 5, 21)->setTimeFromTimeString('22:32:05')->toDateTimeString();
$dt->setDateTime(1975, 5, 21, 22, 32, 5)->toDateTimeString();
$dt->timestamp(169957925)->timezone('Europe/London');
Сравнение дат
Отдельного внимания заслуживает сравнение дат, которое учитывает часовые пояса.
<?php
echo Carbon::now()->tzName; // America/Toronto
$first = Carbon::create(2012, 9, 5, 23, 26, 11);
$second = Carbon::create(2012, 9, 5, 20, 26, 11, 'America/Vancouver');
echo $first->toDateTimeString(); // 2012-09-05 23:26:11
echo $first->tzName; // America/Toronto
echo $second->toDateTimeString(); // 2012-09-05 20:26:11
echo $second->tzName; // America/Vancouver
var_dump($first->eq($second)); // bool(false)
var_dump($first->ne($second)); // bool(true)
var_dump($first->gt($second)); // bool(false)
var_dump($first->gte($second)); // bool(false)
var_dump($first->lt($second)); // bool(true)
var_dump($first->lte($second)); // bool(true)
Код выше можно переписать, используя обычные операции сравнения.
<?php
var_dump($first === $second); // bool(false)
var_dump($first !== $second); // bool(true)
var_dump($first > $second); // bool(false)
var_dump($first >= $second); // bool(false)
var_dump($first < $second); // bool(true)
var_dump($first <= $second); // bool(true)
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.