Carbon для PHP: полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что такое Carbon и зачем он нужен?

Carbon — это мощная и элегантная библиотека для PHP, которая расширяет встроенный класс DateTime. Если вы когда-либо работали с датами в PHP нативно, вы знаете, что стандартный DateTime и DateTimeImmutable предоставляют базовый функционал, но их API часто громоздкий и неинтуитивный. Carbon решает эту проблему, предлагая чистый, читаемый и выразительный синтаксис для работы с датами и временем.

Зачем использовать Carbon? Представьте, что вам нужно:

  • Добавить 3 дня к текущей дате: $date->add(new DateInterval('P3D')) (нативный PHP) vs $date->addDays(3) (Carbon).
  • Получить разницу в днях между двумя датами: громоздкий DateTime::diff() с последующим форматированием vs $date1->diffInDays($date2).
  • Проверить, является ли дата выходным днём: написание собственной логики vs $date->isWeekend().

Carbon делает код не только короче, но и значительно понятнее. Он широко используется в современных PHP-фреймворках, таких как Laravel (где он является стандартом), Symfony, Yii и других. Библиотека полностью совместима с нативным DateTime, что означает, что вы можете использовать Carbon везде, где ожидается DateTime.

Ключевые преимущества Carbon:

  • Выразительный синтаксис: методы названы так, что их назначение понятно без комментариев (startOfDay(), endOfMonth(), isFuture()).
  • Неизменяемость (Immutable): поддержка CarbonImmutable для безопасной работы с датами без побочных эффектов.
  • Локализация: встроенная поддержка форматирования дат на разных языках.
  • Богатый API: сотни методов для манипуляции, сравнения, форматирования и вычисления дат.
  • Интуитивное сравнение: методы типа isBefore(), isAfter(), isSameDay().

Установка Carbon

Carbon устанавливается через Composer — стандартный менеджер пакетов для PHP. Если у вас ещё нет Composer, его необходимо установить (см. getcomposer.org).

Откройте терминал в корне вашего проекта и выполните команду:

composer require nesbot/carbon

После успешной установки в вашем проекте появится папка vendor/ и файл composer.json с добавленной зависимостью. Чтобы использовать Carbon в своём коде, необходимо подключить автозагрузчик Composer:

<?php
require_once 'vendor/autoload.php';

use Carbon\Carbon;

// Теперь можно использовать Carbon
echo Carbon::now(); // 2025-04-03 15:30:00
?>

Важно: Carbon требует PHP версии 8.0 или выше (для последних версий). Рекомендуется использовать PHP 8.1+.

Быстрый старт с примером кода

Давайте сразу перейдём к практике. Вот несколько простых примеров, которые демонстрируют мощь Carbon:

<?php
require_once 'vendor/autoload.php';
use Carbon\Carbon;

// Текущая дата и время
$now = Carbon::now();
echo "Сейчас: " . $now . "\n"; // 2025-04-03 15:30:00

// Создание даты из строки
$birthday = Carbon::createFromDate(1990, 5, 15);
echo "День рождения: " . $birthday->format('d.m.Y') . "\n"; // 15.05.1990

// Манипуляции с датами
$tomorrow = Carbon::tomorrow();
echo "Завтра: " . $tomorrow . "\n";

$nextWeek = Carbon::now()->addWeek();
echo "Через неделю: " . $nextWeek . "\n";

// Разница между датами
$age = $birthday->diffInYears(Carbon::now());
echo "Возраст: $age лет\n"; // 34 или 35

// Проверка условий
$date = Carbon::parse('2025-12-25');
if ($date->isChristmas()) {
    echo "Это Рождество!\n";
}

// Человекочитаемое представление разницы
echo Carbon::now()->subDays(5)->diffForHumans(); // "5 дней назад"
?>

Как видите, код читается почти как обычный английский язык. Это и есть главная философия Carbon.

Основные методы и функции Carbon

Рассмотрим 10 наиболее часто используемых методов Carbon с подробным описанием и примерами.

1. Carbon::now() и Carbon::today()

Что делает: Создаёт объект Carbon с текущей датой и временем (now) или только с текущей датой, обнуляя время до 00:00:00 (today).

Параметры: Необязательный параметр — часовой пояс (строка, например, 'Europe/Moscow').

Пример:

<?php
$nowInMoscow = Carbon::now('Europe/Moscow');
echo $nowInMoscow; // 2025-04-03 18:30:00 (если UTC+3)

$todayStart = Carbon::today();
echo $todayStart; // 2025-04-03 00:00:00
?>

2. Carbon::parse()

Что делает: Универсальный метод для создания объекта Carbon из различных форматов даты и времени. Принимает строку, число (timestamp) или другой объект DateTime.

Параметры: $time — строка, int, DateTime; $tz — часовой пояс (опционально).

Пример:

<?php
$date1 = Carbon::parse('2025-04-03');
$date2 = Carbon::parse('next Friday');
$date3 = Carbon::parse('+2 weeks');
$date4 = Carbon::parse('2025-04-03 15:30:00', 'America/New_York');

echo $date1; // 2025-04-03 00:00:00
echo $date2; // 2025-04-11 00:00:00 (если сегодня четверг)
echo $date3; // 2025-04-17 15:30:00 (относительно текущего момента)
?>

3. addDays(), subDays() и аналогичные

Что делает: Добавляет или вычитает указанное количество дней (недель, месяцев, лет, часов, минут, секунд) к дате. Методы возвращают новый объект Carbon (Carbon неизменяем).

Параметры: $value — целое число (может быть отрицательным).

Пример:

<?php
$date = Carbon::parse('2025-04-03');

$nextDay = $date->addDay(); // +1 день
$previousMonth = $date->subMonth(); // -1 месяц
$inTwoYears = $date->addYears(2); // +2 года
$minus30Minutes = $date->subMinutes(30); // -30 минут

echo $nextDay; // 2025-04-04
echo $previousMonth; // 2025-03-03
echo $inTwoYears; // 2027-04-03
echo $minus30Minutes; // 2025-04-03 14:30:00 (если исходное время было 15:00)
?>

Важно: Все методы модификации (add*, sub*) возвращают новый объект. Исходный объект остаётся неизменным.

4. diffInDays(), diffInHours() и другие diff*()

Что делает: Вычисляет разницу между текущим объектом и переданной датой в указанных единицах (дни, часы, минуты, секунды, годы, месяцы и т.д.).

Параметры: $date — объект Carbon или DateTime; $absolute — boolean (если true, возвращает абсолютное значение).

Пример:

<?php
$start = Carbon::parse('2025-01-01');
$end = Carbon::parse('2025-04-03');

$days = $start->diffInDays($end);
$hours = $start->diffInHours($end);
$weeks = $start->diffInWeeks($end);
$minutes = $start->diffInMinutes($end, false); // отрицательное, если start > end

echo "Дней: $days"; // 92
echo "Часов: $hours"; // 2208
echo "Недель: $weeks"; // 13
echo "Минут: $minutes"; // 132480
?>

5. diffForHumans()

Что делает: Возвращает человекочитаемое представление разницы между датами. Идеально подходит для вывода типа "3 дня назад", "через 2 недели".

Параметры: $other — дата для сравнения (если не указана, сравнивается с now()); $syntax — флаги для настройки вывода; $short — использовать короткую форму (например, "3 дн. назад").

Пример:

<?php
$date = Carbon::parse('-3 days');
echo $date->diffForHumans(); // "3 дня назад"

$futureDate = Carbon::parse('+2 weeks');
echo $futureDate->diffForHumans(); // "через 2 недели"

// Сравнение с конкретной датой
$birthday = Carbon::parse('1990-05-15');
echo $birthday->diffForHumans(Carbon::now()); // "34 года назад" (или "35 лет назад")

// Короткая форма
echo $date->diffForHumans(null, true); // "3 дн. назад"
?>

6. format()

Что делает: Форматирует дату в строку согласно переданному формату. Использует те же символы формата, что и стандартная PHP-функция date().

Параметры: $format — строка формата (например, 'd.m.Y H:i:s').

Пример:

<?php
$date = Carbon::now();

echo $date->format('d.m.Y'); // 03.04.2025
echo $date->format('l, jS F Y'); // Thursday, 3rd April 2025
echo $date->format('H:i:s'); // 15:30:00
echo $date->format('Y-m-d\TH:i:sP'); // 2025-04-03T15:30:00+03:00 (ISO 8601)
?>

7. isWeekend(), isWeekday(), isMonday() и другие is*()

Что делает: Проверяет, соответствует ли дата определённому условию (выходной, будний день, конкретный день недели, начало/конец месяца, года и т.д.).

Параметры: Нет (для простых проверок) или дата для сравнения.

Пример:

<?php
$saturday = Carbon::parse('2025-04-05'); // Это суббота
$friday = Carbon::parse('2025-04-04');

var_dump($saturday->isWeekend()); // true
var_dump($friday->isWeekday()); // true
var_dump($saturday->isMonday()); // false
var_dump($saturday->isSaturday()); // true

// Проверка начала/конца
$date = Carbon::parse('2025-04-01');
var_dump($date->isStartOfMonth()); // true
var_dump($date->isEndOfMonth()); // false

// isPast / isFuture
var_dump(Carbon::parse('-1 day')->isPast()); // true                    

Рекомендаций