Đào tạo Tin học trực tuyến

Tìm hiểu về Thư viện DateTime Carbon trong Laravel


Carbon là một gói phần mềm được phát triển bởi Brian Nesbit mở rộng từ class DateTime của PHP. Từ phiên bản 5.3, Laravel đã tích hợp sẵn thư viện này vào Project. Việc sử dụng tốt thư viện này sẽ giúp bạn rất nhiều vấn đề về xử lý thời gian.

Carbon cung cấp một số hàm khá tốt để xử lý với date trong PHP:
    - Xử lý với timezone
    - Lấy datetime hiện tại dễ dàng
    - Convert datetime sang 1 số định dạng khác dễ đọc
    - Phân tích 1 cụm từ tiếng Anh sang định dạng datetime
    - Dễ dàng thao tác với datetime
Dưới đây là một số tham khảo chi tiết về thư viện Carbon:

addWeeks(2);

// Khởi tạo theo date: Thời gian mặc định là thời gian hiện tại
Carbon::createFromDate($year, $month, $day, $tz);

// Khởi tạo theo time: Ngày tháng năm mặc định là ngày tháng năm hiện tại
Carbon::createFromTime($hour, $minute, $second, $tz);

// Khởi tạo theo cả date và time
Carbon::create($year, $month, $day, $hour, $minute, $second, $tz);

// Khởi tạo theo datetime và format xác định
Carbon::createFromFormat($format, $time, $tz);

// Khởi tạo datetime để làm việc với [unix timestamp](https://en.wikipedia.org/wiki/Unix_time)
Carbon::createFromTimestamp($timestamp, $tz)
// Nếu tham số truyền vào là không phù hợp thì sẽ throw ra lỗi InvalidArgumentException với message lỗi được định nghĩa trong DateTime::getLastErrors().

// Thiết lập múi giờ
$nowInLondonTz = Carbon::now('Europe/London');
$dtVNTz = Carbon::createFromDate(2016, 1, 1, 'Asia/Ho_Chi_Minh');
$dtTokyoTz = Carbon::createFromDate(2016, 1, 1, 'Asia/Tokyo');

// Tạo 1 đối tượng có giá trị giống hệt với đối tượng ban đầu:
$dt = Carbon::now();
echo $dt->diffInYears($dt->copy()->addYear());  // 1

// Khởi tạo giá trị datetime lớn nhất và nhỏ nhất
Carbon::maxValue(); // '2038-01-18 22:14:07'
Carbon::minValue(); // '1901-12-13 15:45:52'

// Hiển thị theo ngôn ngữ:
Carbon::setLocale('vi');
echo Carbon::now()->addYear()->diffForHumans();    // in 1 Jahr

// Testing
$testDate = Carbon::createfromDate(2016, 03, 26);
Carbon::setTestNow($testDate);  // set the mock
echo Carbon::now();             // 2016-03-26 00:00:00
echo new Carbon();              // 2016-03-26 00:00:00
var_dump(Carbon::hasTestNow()); // bool(true)
Carbon::setTestNow();           // clear the mock
var_dump(Carbon::hasTestNow()); // bool(false)
echo Carbon::now();             // today

// Getet - Hàm lấy thông số thông dụng, trả về integer:
$now = Carbon::now();
$now->year;
$now->month;
$now->day;
$now->hour;
$now->minute;
$now->second;
$now->micro;
$now->dayOfWeek;
$now->dayOfYear;
$now->weekOfMonth;
$now->weekOfYear;
$now->daysInMonth;
$now->timestamp;

// Setter các hàm thiết lập tham số 
$dt = Carbon::now();
$dt->year = 1975;
$dt->month = 13; // year = year + 1, month = month - 12
$dt->month = 5;
$dt->day = 21;
$dt->hour = 22;
$dt->minute = 32;
$dt->second = 5;
$dt->timestamp = 169957925;  // Không thay đổi timezone
// Set timezone thông qua DateTimeZone hoặc string
$dt->timezone = new DateTimeZone('Europe/London');
$dt->timezone = 'Europe/London';
$dt->tz = 'Europe/London';

// Thiết lập có đối số:
$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();
$dt->timestamp(169957925)->timezone('Europe/London');
$dt->tz('America/Toronto')->setTimezone('America/Vancouver');

// Isset validate các thuộc tính trong Carbon
var_dump(isset(Carbon::now()->iDoNotExist)); // bool(false)
var_dump(isset(Carbon::now()->hour));        // bool(true)
var_dump(empty(Carbon::now()->iDoNotExist)); // bool(true)
var_dump(empty(Carbon::now()->year));        // bool(false)

// Định dạng chuỗi datetime_
$dt = Carbon::create(1975, 12, 25, 14, 15, 16);
var_dump($dt->toDateTimeString() == $dt);// bool(true) => uses __toString()
echo $dt->toDateString();                // 1975-12-25
echo $dt->toFormattedDateString();       // Dec 25, 1975
echo $dt->toTimeString();                // 14:15:16
echo $dt->toDateTimeString();            // 1975-12-25 14:15:16
echo $dt->toDayDateTimeString();         // Thu, Dec 25, 1975 2:15 PM

// Một số định dạng phổ biến
$dt = Carbon::now();
// $dt->toAtomString() is the same as $dt->format(DateTime::ATOM);
echo $dt->toAtomString();      // 1975-12-25T14:15:16-05:00
echo $dt->toCookieString();    // Thursday, 25-Dec-1975 14:15:16 EST
echo $dt->toIso8601String();   // 1975-12-25T14:15:16-0500
echo $dt->toRfc822String();    // Thu, 25 Dec 75 14:15:16 -0500
echo $dt->toRfc850String();    // Thursday, 25-Dec-75 14:15:16 EST
echo $dt->toRfc1036String();   // Thu, 25 Dec 75 14:15:16 -0500
echo $dt->toRfc1123String();   // Thu, 25 Dec 1975 14:15:16 -0500
echo $dt->toRfc2822String();   // Thu, 25 Dec 1975 14:15:16 -0500
echo $dt->toRfc3339String();   // 1975-12-25T14:15:16-05:00
echo $dt->toRssString();       // Thu, 25 Dec 1975 14:15:16 -0500
echo $dt->toW3cString();       // 1975-12-25T14:15:16-05:00

// So sánh 2 giá trị datetime
$first = Carbon::create(2016, 03, 26, 01, 02, 03);
$second = Carbon::create(2016, 03, 26, 20, 02, 03);
var_dump($first->eq($second));   // bool(false)
var_dump($first->ne($second));   // bool(true)
var_dump($first->gt($second));   // bool(false)
var_dump($first->gte($second));  // bool(false)
var_dump($first->lt($second));   // bool(true)
var_dump($first->lte($second));  // bool(true)

// So sánh 1 giá trị với 2 giá trị datetime khác
$first = Carbon::create(2016, 03, 26, 01);
$second = Carbon::create(2016, 03, 26, 05);
var_dump(Carbon::create(2016, 03, 26, 03)->between($first, $second));          // bool(true)
var_dump(Carbon::create(2016, 03, 26, 05)->between($first, $second));          // bool(true)
var_dump(Carbon::create(2016, 03, 26, 05)->between($first, $second, false));   // bool(false)
// So sánh max, min
php
$dt1 = Carbon::create(2016, 03, 26, 0, 0, 0);
$dt2 = Carbon::create(2016, 03, 30, 0, 0, 0);
echo $dt1->min($dt2);  // 2016-03-26 00:00:00
echo $dt1->max($dt2);  // 2016-03-30 00:00:00
echo $dt1->max();      // now()

// So sánh với now()
$dt = Carbon::now();
$dt->isWeekday();
$dt->isWeekend();
$dt->isYesterday();
$dt->isToday();
$dt->isTomorrow();
$dt->isFuture();
$dt->isPast();
$dt->isLeapYear();
$dt->isSameDay(Carbon::now());
$born = Carbon::createFromDate(1987, 4, 23);
$noCake = Carbon::createFromDate(2014, 9, 26);
$yesCake = Carbon::createFromDate(2014, 4, 23);
$overTheHill = Carbon::now()->subYears(50);
var_dump($born->isBirthday($noCake));   // bool(false)
var_dump($born->isBirthday($yesCake));  // bool(true)
var_dump($overTheHill->isBirthday());   // bool(true) -> default compare it to today!

// Cộng trừ với Datetime
$dt = Carbon::create(2012, 1, 31, 0);
echo $dt->toDateTimeStri// 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 equivalent of $dt->month($dt->month + 1); so it wraps
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

// Tính toán sự sai khác giữa 2 giá trị datetime
diffInSeconds()
diffInMinutes()
diffInHours()
diffInDays()
diffInYears()
diffInMonths()
diffInWeeks()
diffInWeekdays()
diffInWeekendDays()
diffInDaysFiltered()
diffInHoursFiltered()
diffFiltered()
// Ví dụ:
$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

$dt = Carbon::create(2014, 1, 1);
$dt2 = Carbon::create(2014, 12, 31);
$daysForExtraCoding = $dt->diffInDaysFiltered(function(Carbon $date) {
   return $date->isWeekend();
}, $dt2);

echo $daysForExtraCoding;      // 104

$dt = Carbon::create(2014, 1, 1)->startOfDay();
$dt2 = $dt->copy()->endOfDay();
$littleHandRotations = $dt->diffFiltered(CarbonInterval::minute(), function(Carbon $date) {
   return $date->minute === 0;
}, $dt2);

echo $littleHandRotations;     // 24

// Hiển thị thời gian tương đối
$dt     = Carbon::now();
$past   = $dt->subMonth();
$future = $dt->addMonth();

echo $dt->subDays(10)->diffForHumans();     // 10 days ago
echo $dt->diffForHumans($past);             // 1 month ago
echo $dt->diffForHumans($future);           // 1 month before[/code]

// Modify
$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfDay();                            // 2012-01-31 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfDay();                              // 2012-01-31 23:59:59

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfMonth();                          // 2012-01-01 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfMonth();                            // 2012-01-31 23:59:59

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfYear();                           // 2012-01-01 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfYear();                             // 2012-12-31 23:59:59

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfDecade();                         // 2010-01-01 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfDecade();                           // 2019-12-31 23:59:59

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->startOfCentury();                        // 2000-01-01 00:00:00

$dt = Carbon::create(2012, 1, 31, 12, 0, 0);
echo $dt->endOfCentury(); 
                         // 2099-12-31 23:59:59

// Hằng số

var_dump(Carbon::SUNDAY);                          // int(0)
var_dump(Carbon::MONDAY);                          // int(1)
var_dump(Carbon::TUESDAY);                         // int(2)
var_dump(Carbon::WEDNESDAY);                       // int(3)
var_dump(Carbon::THURSDAY);                        // int(4)
var_dump(Carbon::FRIDAY);                          // int(5)
var_dump(Carbon::SATURDAY);                        // int(6)

var_dump(Carbon::YEARS_PER_CENTURY);               // int(100)
var_dump(Carbon::YEARS_PER_DECADE);                // int(10)
var_dump(Carbon::MONTHS_PER_YEAR);                 // int(12)
var_dump(Carbon::WEEKS_PER_YEAR);                  // int(52)
var_dump(Carbon::DAYS_PER_WEEK);                   // int(7)
var_dump(Carbon::HOURS_PER_DAY);                   // int(24)
var_dump(Carbon::MINUTES_PER_HOUR);                // int(60)
var_dump(Carbon::SECONDS_PER_MINUTE);              // int(60)

// CarbonInterval

class CarbonInterval extends \DateInterval
{
    // code here
}
?>

 


Xem thêm

   Có gì khác biệt giữa HTML và HTML5?

   5 yếu tố quan trọng của định hướng thị giác trong thiết kế web

   Một số thẻ và Type quan trọng với HTML5 cần chú ý trong quá trình thiết kế website

   Xử lý text với Typography trong Bootstrap 4 CSS FrameWork

   Bootstrap 4.0: Bài 2. Thiết lập hệ thống lưới Grid System

   Bootstrap 4.0: Bài 1. Giới thiệu và các thiết lập cơ bản về công cụ, css, javascript

   Laravel 5.6: Thiết kế trang đăng ký người dùng

   Laravel 5.6: Bổ sung thêm cơ sở dữ liệu cho website

   Màu nền và màu chữ trong Bootstrap 4 CSS Framework

   Laravel 5.6: Validated, xử lý hệ thống đăng nhập, đăng xuất, ghi nhớ đăng nhập

   Laravel 5.6: Thiết kế trang đăng nhập hệ thống quản trị Login

   Laravel 5.6 : Xây dựng hệ thống Models

   Hướng dẫn cài đặt Opencart - CMS hệ thống bán hàng trực tuyến