Laravel 9. Работа с датой и временем
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;
}
Важлива інформація
України
втрати противника
орієнтовно склали: