Hướng dẫn xử lý thời gian với laravel carbon

  • June 11, 2020
  • 5989

Cùng tìm hiểu các hàm xử lý thời gian bá đạo của Carbon. Một class được tích hợp sẵn trong laravel, giúp bạn giải quyết mọi vấn đề liên quan đến thời gian. Lớp Carbon được kế thừa từ lớp datetime trong php.


<?php
namespace Carbon;

class Carbon extends \DateTime
{
    // code here
}

Làm sao sao để dùng carbon trong laravel

Carbon được khai báo với namespace Carbon. Vì vậy để sử dụng nó bạn cần import nó vào class cần dùng với từ khoá use ở bất kì file nào trong controller, model, helper, service ...


use Carbon\Carbon;

Carbon làm được gì?

Carbon có thế xử lý mọi vấn đề liên quan đến thời gian, tạo ngày, chuyển từ string sang datetime, lấy ngày, đinh dạng lại ngày, so sánh ngày, cộng, trừ ngày ...

Các hàm khởi tạo(Instantiation) thời gian


// Create a new Carbon instance from a specific date and time.
Carbon::create(2000, 1, 12, 13, 0, 0); // 2000-01-12 13:00:00

// Create a Carbon instance from a string
Carbon::parse('2020-06'); // 2020-06-01 00:00:00

// Create a Carbon instance from a specific format
Carbon::createFromFormat('Ym', 202001); // 2020-01 các thông tin khác sẽ lấy theo ngày hiện tại

Get time

Có thể lấy thời gian theo timezone. Nếu không set timezone thì thời gian sẽ lấy theo timezone của server. Danh sách các time timezone


// Get current time with timezone
Carbon::now('Asia/Ho_Chi_Minh'); // 2020-06-12 14:12:30

// Get day, month, year, hour, minute, second, day of week, day of year ...
Carbon::now()->day; //ngày
Carbon::now()->month; //tháng
Carbon::now()->year; //năm
Carbon::now()->hour; //giờ
Carbon::now()->minute; //phút
Carbon::now()->second; //giây
Carbon::now()->dayOfWeek; //ngày của tuần
Carbon::now()->dayOfYear; //ngày của năm
Carbon::now()->weekOfMonth; //ngày của tháng
Carbon::now()->weekOfYear; //tuần của năm
Carbon::now()->daysInMonth; //số ngày trong tháng

Set time


// Set time by string time
Carbon::parse('2020-06')->setTimeFromTimeString('09:00'); // 2020-06-01 09:00:00

// Set time
$dt = Carbon::now();
$dt->year(2020)->month(5)->day(21)->hour(22)->minute(32)->second(5)->toDateTimeString();
$dt->setDate(2020, 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();
// Các cách viết trên đều trả về ngày: 2020-05-21 22:32:05

Format time


Carbon::parse('2020-06-08')->format('Y-m-d H:i:s'); // 2020-06-08 00:00:00
Carbon::parse('2020-06-08')->format('Y-m-01 H:i:s'); // 2020-06-01 00:00:00

Compare time


// So sánh với thời gian hiện tại, các hàm đều trả về giá trị boolean
$now = Carbon::now();
$now->isWeekday(); // ngày hiện tại từ thứ 2 đến thứ 6 trả về true
$now->isWeekend(); // ngày hiện là thứ 7, chủ nhật trả về true
$date->isYesterday(); // nếu là ngày hôm qua thì true
$date->isToday(); // nếu là ngày hôm nay thì true
$date->isTomorrow(); // nếu là ngày mai thi true
$date->isFuture(); // nếu ngày lớn hơn ngày hôm nay thì true
$date->isPast(); // nếu ngày nhỏ hơn ngày hôm nay thì true

// So sánh 2 ngày
$date1->equalTo($date2); // So sánh bằng
$date1->notEqualTo($date2); // So sánh không bằng
$date1->greaterThanOrEqualTo($date2); // So sánh lớn hơn hoặc bằng
$date1->greaterThan($date2); // So sánh lớn hơn
$date1->lessThan($date2); // So sánh nhỏ hơn
$date1->lessThanOrEqualTo($date2); // So sánh nhỏ hơn hoặc bằng

Addition and Subtraction time


$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
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->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

So sánh sự khác nhau giữa 2 thời gian


$dt1->diffInSeconds($dt1); // 2 ngày cách nhau bao nhiêu giây
$dt1->diffInMinutes($dt2) // 2 ngày cách nhau bao nhiêu phút
$dt1->diffInHours($dt2); // 2 ngày cách nhau bao nhiêu giờ
$dt1->diffInDays($dt2); // 2 ngày cách nhau bao nhiêu ngày

Difference for Humans

Như trên facebook các bạn thấy các bài viết sẽ có trạng thái là 1 phút trước, 1 giờ trước chẳng hạn Carbon cũng hỗ trợ phần này luôn


Carbon::setLocale('vi'); // hiển thị ngôn ngữ tiếng việt.
$dt = Carbon::create(2018, 10, 18, 14, 40, 16);
$dt2 = Carbon::create(2018, 10, 18, 13, 40, 16);
echo $dt->diffForHumans($dt2); // 1 giờ sau
echo $dt2->diffForHumans($dt); // 1 giờ trước

Hi vọng với những chia sẽ trên các bạn không còn sợ hãi khi làm việc với thời gian nữa. Nếu bạn muốn hiểu sâu hơn về Carbon hãy tham khảo thêm tài liệu trên trang chủ Carbon