Слава Україні!

Laravel 9. Работа с датой и временем

Laravel 9. Carbon - работа с датой и временем
17-го лютого 2023, 11:13

1. Работа с Carbon

Laravel включает Carbon - мощную библиотеку манипуляций с датой и временем. Чтобы создать новый экземпляр Carbon, вы можете вызвать функцию now. Эта функция доступна глобально в вашем приложении Laravel:

$now = now();

Или вы можете создать новый экземпляр Carbon, используя класс Illuminate\Support\Carbon:


use Illuminate\Support\Carbon;

$now = Carbon::now();

Наиболее часто востребованные функции:


    // Вывод текущей даты и времени - 2020-04-01 12:34:56
    echo Carbon::now();
    // Получает дату в определенном формате и преобразует ее в обьект
    // Выведет - 2020-04-01 12:34:56
    $start_day = '2020-04-01 12:34:56';
    echo Carbon::createFromFormat('Y-m-d H:i:s', $start_day);
    // Выведет дату и время начала суток - 2020-04-01 00:00:00
    echo Carbon::now()->startOfDay();
    // Выведет дату и время конца суток - 2020-04-01 23:59:59
    echo Carbon::now()->endOfDay();

Для того чтоб получить прошедшую или будущую дату имеется можество функций с префиксами sub и add соответственно:


    // Вывод даты, которая была 3 дня назад - 2020-03-29 12:34:56
    echo Carbon::now()->subDay(3);
    // Вывод даты, которая будет через 2 недели - 2020-04-15 12:34:56
    echo Carbon::now()->addWeek(2);

Т.е. "отматывая" дату назад - указываем subMinutes(), subDay(), subWeek(), subMonth() и т.д. Если же хотим получить будущую дату, то соответственно - addMinutes(), addDay(), addWeek(), addMonth().

Для изменения часового пояса:


    // Вывод даты в Киеве - 2020-03-29 12:34:56
    echo Carbon::now('Europe/Kiev');
    // Вывод даты в Лондоне - 2020-03-29 10:34:56
    echo Carbon::now('Europe/London');;

Примеры с разными локалями и "человекопонятными" периодами


    // Вывод периода на украинском 2 минуты назад - 2 хвилини тому
    echo Carbon::now()->locale('uk')->subMinutes(2)->diffForHumans();
    // Вывод периода на английском через 1 минуту - 1 minute from now
    echo Carbon::now()->locale('en')->addMinutes(2)->diffForHumans();
    // Вывод даты на украинском - середа, квітень 1-го 2020, 12:34 
    echo Carbon::now()->locale('uk')->isoFormat('dddd, MMMM Do YYYY, h:mm');
    // Вывод даты на французком - mercredi, avril 1er 2020, 12:34 
    echo Carbon::now()->locale('fr')->isoFormat('dddd, MMMM Do YYYY, h:mm');

2. Запросы с Carbon

Получить все заказы за три последних дня:


Order::where('created_at', '>=', Carbon::now()->startOfDay()->subdays(3))->get(['id','created_at']);

Получить кол-во заказов за прошлый год с рабивкой по месяцам:


Order::whereYear('created_at', Carbon::now('Y')->firstOfYear()->subYear(1))
    ->groupBy('monthname')
    ->get([
        DB::raw("(COUNT(*)) as count"),
        DB::raw("MONTHNAME(created_at) as monthname")
    ])
    ->pluck( 'count', 'monthname' );

Для построения графика необходимо было иметь возможность получать кол-во продаж начиная с определенной даты за определенный период.

Дата и период прилетали из формы.


public function getData($start_day, $period)
{
    $dates = collect();
    for ($i = 0; $i<$period; $i++) {
        $date = Carbon::createFromFormat('Y-m-d', $start_day)
            ->addDays($i)->format('Y-m-d');
        $dates->put($date, 0);
    }
    $data = Order::whereBetween( 'created_at', [$dates->keys()->first(), $dates->keys()->last()] )
    ->groupBy( 'date' )
    ->orderBy( 'date' )
    ->get( [
        DB::raw( 'DATE( created_at ) as date' ),
        DB::raw( 'COUNT( * ) as "count"' )
    ] )
    ->pluck( 'count', 'date' );
    $dates = $dates->merge( $data );
    return $dates;
}

Важлива інформація

Міністерство оборони
України
з 24.02 по 11.11
втрати противника
орієнтовно склали:
710660 ( +1770 ) особового складу
9253 ( +4 ) танків
18766 ( +40 ) бойових бронемашин
20314 ( +34 ) артилерійських систем
1245 ( +0 ) РСЗВ
996 ( +0 ) засоби ППО
369 ( +0 ) літаків
329 ( +0 ) гелікоптерів
28802 ( +119 ) автомобільної техніки
28 ( +0 ) кораблі / катери
2636 ( +2 ) крилаті ракети
18676 ( +57 ) БПЛА
3620 ( +16 ) спец. техніки
4 ( +0 ) установок ОТРК/ТРК
1 ( +0 ) підводні човни