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. Nếu bạn cần học và sử dụng Laravel thì không nên bỏ qua thư viện này…
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
}
?>