Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Carbon PHP: Объектно-ориентированный дизайн

Для работы с датами в 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)

Дополнительные материалы

  1. Carbon Docs
  2. Методы для сравнения дат

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Занимайтесь созданием сайтов, веб-приложений, сервисов и их интеграцией с внутренними бизнес-системами на бекенд-языке PHP
10 месяцев
с нуля
Старт 7 ноября

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»