Простая настройка времени в Laravel и PHP с помощью Carbon

Работа с датой и временем в PHP – не самая простая и понятная задача. Тут приходится иметь дело с strtotime, сталкиваться с проблемами форматирования, сложными вычислениями и т.п.

Пакет под названием Carbon сделает управление датой/временем в PHP намного проще, а код – более читабельным и простым в поддержке.

Carbon – это пакет, разработанный Брайаном Несбитом, расширяющий PHP класс DateTime. Он предоставляет удобные функции для работы с датами в PHP, в частности, такие вещи, как:

  • Работа с часовыми поясами
  • Простое определение текущего времени
  • Преобразование даты и времени во человеко-читаемый формат
  • Обработка фраз (на английском языке) в данные datetime
  • Сложение и вычитание дат (например, +2 недели, -6 месяцев).
  • Семантический способ работы с датами

Все вышеперечисленное привело к созданию очень полезного пакета, который упрощает работу со временем в PHP.

Установка Carbon

Чтобы использовать Carbon, нужно импортировать его из пространства имен Carbon. К счастью, Carbon уже включен в Laravel, потому нам не придется добавлять его через Composer.

Чтобы импортировать Carbon, используйте:

<?php
use Carbon\Carbon;

После импорта можно попробовать этот пакет в работе.

Определение даты/времени

// определить текущее время - 2015-12-19 10:10:54
$current = Carbon::now();
$current = new Carbon();
// определить сегодняшнюю дату - 2015-12-19 00:00:00
$today = Carbon::today();
// определить вчерашнюю дату - 2015-12-18 00:00:00
$yesterday = Carbon::yesterday();
// определить завтрашнюю дату - 2015-12-20 00:00:00
$tomorrow = Carbon::tomorrow();
// обработать определенную строку - 2016-01-01 00:00:00
$newYear = new Carbon('first day of January 2016');
// установить часовой пояс - 2016-01-01 00:00:00
$newYearPST = new Carbon('first day of January 2016', 'America\Pacific');

Тонкий контроль дат

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

Carbon::createFromDate($year, $month, $day, $tz);
Carbon::createFromTime($hour, $minute, $second, $tz);
Carbon::create($year, $month, $day, $hour, $minute, $second, $tz);

Эти аргументы очень полезны, если ваши данные о дате или времени находятся в формате, который обычно не распознается Carbon. Если вы передадите значение null для любого из этих атрибутов, по умолчанию будет установлено текущее значение.

Управление датой/временем

Определение даты и времени – не единственная задача, которую нужно выполнять при работе с датами. Вам также часто придется изменять дату или время: например, при настройке пробного периода для пользователя нужно сделать так, чтобы он автоматически истек через определенное время. Предположим, чтобы настроить 30-дневный пробный период, мы можем использовать функции сложения и вычитания.

Это делается так:

// определить текущую дату
$current = Carbon::now();
// добавить 30 дней к текущей дате
$trialExpires = $current->addDays(30);

В документации Carbon вы найдете другие примеры использования методов add() и sub():

$dt = Carbon::create(2012, 1, 31, 0);
echo $dt->toDateTimeString();            // 2012-01-31 00:00:00
echo $dt->addYears(5);                   // 2017-01-31 00:00:00
echo $dt->addYear();                     // 2018-01-31 00:00:00
echo $dt->subYear();                     // 2017-01-31 00:00:00
echo $dt->subYears(5);                   // 2012-01-31 00:00:00
echo $dt->addMonths(60);                 // 2017-01-31 00:00:00
echo $dt->addMonth();                    // 2017-03-03 00:00:00 эквивалент $dt->month($dt->month + 1);
echo $dt->subMonth();                    // 2017-02-03 00:00:00
echo $dt->subMonths(60);                 // 2012-02-03 00:00:00
echo $dt->addDays(29);                   // 2012-03-03 00:00:00
echo $dt->addDay();                      // 2012-03-04 00:00:00
echo $dt->subDay();                      // 2012-03-03 00:00:00
echo $dt->subDays(29);                   // 2012-02-03 00:00:00
echo $dt->addWeekdays(4);                // 2012-02-09 00:00:00
echo $dt->addWeekday();                  // 2012-02-10 00:00:00
echo $dt->subWeekday();                  // 2012-02-09 00:00:00
echo $dt->subWeekdays(4);                // 2012-02-03 00:00:00
echo $dt->addWeeks(3);                   // 2012-02-24 00:00:00
echo $dt->addWeek();                     // 2012-03-02 00:00:00
echo $dt->subWeek();                     // 2012-02-24 00:00:00
echo $dt->subWeeks(3);                   // 2012-02-03 00:00:00
echo $dt->addHours(24);                  // 2012-02-04 00:00:00
echo $dt->addHour();                     // 2012-02-04 01:00:00
echo $dt->subHour();                     // 2012-02-04 00:00:00
echo $dt->subHours(24);                  // 2012-02-03 00:00:00
echo $dt->addMinutes(61);                // 2012-02-03 01:01:00
echo $dt->addMinute();                   // 2012-02-03 01:02:00
echo $dt->subMinute();                   // 2012-02-03 01:01:00
echo $dt->subMinutes(61);                // 2012-02-03 00:00:00
echo $dt->addSeconds(61);                // 2012-02-03 00:01:01
echo $dt->addSecond();                   // 2012-02-03 00:01:02
echo $dt->subSecond();                   // 2012-02-03 00:01:01
echo $dt->subSeconds(61);                // 2012-02-03 00:00:00

Методы получения и изменения значения

Методы получения и изменения значения (getters и setters) также позволяют быстро управлять или извлекать данные о дате и времени.

$dt = Carbon::now();
// получение данных
$dt->year   = 2015;
$dt->month  = 04;
$dt->day    = 21;
$dt->hour   = 22;
$dt->minute = 32;
$dt->second = 5;
// настройка данных
var_dump($dt->year);
var_dump($dt->month);
var_dump($dt->day);
var_dump($dt->hour);
var_dump($dt->second);
var_dump($dt->dayOfWeek);
var_dump($dt->dayOfYear);
var_dump($dt->weekOfMonth);
var_dump($dt->daysInMonth);

Сеттеры также можно объединить в единую строку:

$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->setDateTime(1975, 5, 21, 22, 32, 5)->toDateTimeString();

Форматирование даты/времени

В приведенном выше примере вы могли заметить метод -&gt;toDateTimeString(). С его помощью мы можем легко отформатировать дату/время для наших целей. В этом случае мы получим строку datetime.

$dt = Carbon::now();
echo $dt->toDateString();               // 2015-12-19
echo $dt->toFormattedDateString();      // Dec 19, 2015
echo $dt->toTimeString();               // 10:10:16
echo $dt->toDateTimeString();           // 2015-12-19 10:10:16
echo $dt->toDayDateTimeString();        // Sat, Dec 19, 2015 10:10 AM
.                                       // ... of course format() is still available
echo $dt->format('l jS \\of F Y h:i:s A'); // Saturday 19th of December 2015 10:10:16 AM

Относительное время

Carbon позволяет отображать относительное время с помощью методов diff().

Предположим, у нас есть блог, и мы хотим показать, что публикация была добавлена 3 часа назад. Мы могли бы сделать это с помощью этих методов.

Определение разницы

Эти методы позволяют вычислить разницу во времени:

$current = Carbon::now();
$dt      = Carbon::now();
$dt = $dt->subHours(6);
echo $dt->diffInHours($current);         // -6
echo $current->diffInHours($dt);         // 6
$future = $current->addMonth();
$past   = $current->subMonths(2);
echo $current->diffInDays($future);      // 31
echo $current->diffInDays($past);        // -62

Отображение разницы

Относительное время может быть более полезным для читателей, чем точная дата или метка времени.

Например, вместо того, чтобы отображать точное время публикации (допустим, 8:12), мы покажем посетителям блога, что публикация появилась 3 часа назад.

Метод diffForHumans() используется для вычисления разницы, а также ее преобразования в удобочитаемый формат.

Вот примеры его использования:

$dt     = Carbon::now();
$past   = $dt->subMonth();
$future = $dt->addMonth();
echo $dt->subDays(10)->diffForHumans();     // 10 дней назад
echo $dt->diffForHumans($past);             // 1 месяц назад
echo $dt->diffForHumans($future);           // через 1 месяц

Заключение

Carbon умеет еще много всего. Обязательно почитайте официальную документацию Carbon. Надеемся, этот пакет упростит вашу работу с датами и временем в PHP и ускорит разработку вашего приложения.

Tags: , ,

Добавить комментарий