Sử dụng Carbonb package trong Laravel và PHP
Carbon Laravel 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.
DateTime Laravel
Những developer đã và đang việc với PHP đều biết việc xử lý những tác vụ liên quan đến thời gian không hề đơn giản. Ta phải giải quyết strtotime
, những vấn đề liên quan đến định dạng, tính toán, và rất nhiều ti tỉ thứ khác nữa.
Carbon PHP package có thể giúp các developer xử lý ngày và giờ trong PHP dễ dàng hơn bao giờ hết, đồng thời code cũng dễ đọc và dễ bảo trì hơn với Carbon – một package do Brian Nesbit phát triển, có khả năng mở rộng class DateTime của PHP.
Package này cung cấp nhiều chức năng để người dùng có thể dễ dàng quản lý ngày tháng ở trong PHP. Chẳng hạn như:
- Xử lý múi giờ
- Xem thời gian hiện tại
- Chuyển đổi ngày giờ sang định dạng dễ đọc hơn
- Phân tích cú pháp trong tiếng Anh (chẳng hạn như
"first day of January 2016"
) - Thực hiện các phép toán cộng, trừ
("+2 weeks"
,"-6 months"
)với các đối tượng ngày giờ.
>> Xem thêm: Package là gì? Tìm hiểu về Package trong Java
Điều kiện
Trước hết, để có thể cài đặt Carbon Laravel, ta cần có những điều kiện sau:
- Đang có một môi trường develop Laravel đang hoạt động. Các bạn có thể tham khảo tài liệu trên trang web chính thức của Laravel để cài đặt. Với Laravel Sail thì ta sẽ còn cần thêm cả Docker.
Trong ví dụ này, chúng tôi sử dụng PHP v8.0.5, Composer v2.0.13, MySQL 8.0.24, Laravel v8.40.0 và Carbon v2.31.
Thiết lập project
Để dùng được Carbon Laravel, trước hết ta cần import Carbon trong namespace Carbon
. (Carbon có sẵn trong framework Laravel):
<?php
use Carbon\Carbon;
Bây giờ, ta có thể tự do khám phá thư viện Carbon Laravel.
Xem thời gian cụ thể
Để xem thời gian hiện tại:
$current = Carbon::now();
Truy xuất thời gian hiện tại:
$current2 = new Carbon();
Ngày hiện tại:
$today = Carbon::today();
Ngày hôm qua:
$yesterday = Carbon::yesterday();
Ngày mai:
$tomorrow = Carbon::tomorrow();
Phân tích một xâu:
$newYear = new Carbon('first day of January 2016');
- Kết quả:
2016-01-01 00:00:00
Các helper sau cung cấp các request mà con người có thể được đọc với những nhu cầu điển hình về ngày, giờ: today()
, yesterday()
, tomorrow()
.
Tạo ngày trong Carbon Laravel
Bên cạnh các cách để xác định ngày giờ nhanh chóng, Carbon còn cho phép chúng ta tạo ngày và giờ từ một số argument cụ thể.
createFromDate()
nhận $year
, $month
, $day
, $tz
(time zone – múi giờ):
Carbon::createFromDate($year, $month, $day, $tz);
createFromTime()
nhận $hour
, $minute
, $second
, and $tz
(time zone):
Carbon::createFromTime($hour, $minute, $second, $tz);
create()
nhận $year
, $month
, $day
, $hour
, $minute
, $second
, $tz
(time zone):
Carbon::create($year, $month, $day, $hour, $minute, $second, $tz);
Các hàm này rất hữu ích khi ta nhận được những ngày, giờ có định dạng Caron không thể nhận dạng được. Nếu ta pass null
vào các attribute này, mặc định nó sẽ trả về thời gian hiện tại.
Xử lý Date và Time
Bên cạnh một số thao tới cơ bản với ngày và giờ, ta còn có thể cần một số tác vụ phức tạp, nâng hơn hơn. Lấy ví dụ: khi tạo một thời gian dùng thử cho user, ta cần thời gian này hết hạn sau một khoảng thời gian nhất định nào đó. Vì vậy, giả sử thời gian dùng thử là 30 ngày, thì ta có thể tính toán nó bằng các phép toán cộng, trừ trong Carbon Laravel.
Trong ví dụ này, ta có thể dùng addDays()
để xác định thời gian hết hạn:
// get the current time
$current = Carbon::now();
// add 30 days to the current time
$trialExpires = $current->addDays(30);
Trong tài liệu Carbon Laravel, còn có một số method của add()
và sub()
khác nữa. Tham khảo ngay tại đây.
Giả sử thời gian được đặt thành 31/1/2012:
$dt = Carbon::create(2012, 1, 31, 0);
echo $dt->toDateTimeString();
Kết quả:
2012-01-31 00:00:00
Việc chỉnh sửa ngày với các hàm addYears()
và subYears()
có kết quả như sau:
Lệnh | Output |
echo $dt->addYear(); | 2012-01-31 00:00:00 |
echo $dt->addYears(5); | 2017-01-31 00:00:00 |
echo $dt->subYear(); | 2011-01-31 00:00:00 |
echo $dt->subYears(5); | 2007-01-31 00:00:00 |
Đối với hàm addMonths()
và subMonths()
:
Lệnh | Output |
echo $dt->addMonth(); | 2012-03-03 00:00:00 |
echo $dt->addMonths(60); | 2017-01-31 00:00:00 |
echo $dt->subMonth(); | 2011-12-31 00:00:00 |
echo $dt->subMonths(60); | 2007-01-31 00:00:00 |
Hãy để ý khi ta thêm một tháng vào “January 31” thì kết quả sẽ là “March 3” chứ không phải “February 28”. Nếu không thích việc này, hãy dùng hàm addMonthWithoutOverflow()
.
Với các hàm addDays()
và subDays()
:
Lệnh | Output |
echo $dt->addDay(); | 2012-02-01 00:00:00 |
echo $dt->addDays(29); | 2012-02-29 00:00:00 |
echo $dt->subDay(); | 2012-01-30 00:00:00 |
echo $dt->subDays(29); | 2012-01-02 00:00:00 |
Hàm addWeekdays()
và subWeekdays()
:
Lệnh | Output |
echo $dt->addWeekday(); | 2012-02-01 00:00:00 |
echo $dt->addWeekdays(4); | 2012-02-06 00:00:00 |
echo $dt->subWeekday(); | 2012-01-30 00:00:00 |
echo $dt->subWeekdays(4); | 2012-01-25 00:00:00 |
Hàm addWeeks()
và subWeeks()
:
Lệnh | Output |
echo $dt->addWeek(); | 2012-02-07 00:00:00 |
echo $dt->addWeeks(3); | 2012-02-21 00:00:00 |
echo $dt->subWeek(); | 2012-01-24 00:00:00 |
echo $dt->subWeeks(3); | 2012-01-10 00:00:00 |
Hàm addHours()
và subHours()
:
Lệnh | Output |
echo $dt->addHour(); | 2012-01-31 01:00:00 |
echo $dt->addHours(24); | 2012-02-01 00:00:00 |
echo $dt->subHour(); | 2012-01-30 23:00:00 |
echo $dt->subHours(24); | 2012-01-30 00:00:00 |
addMinutes()
và subMinutes()
:
Lệnh | Output |
echo $dt->addMinute(); | 2012-01-31 00:01:00 |
echo $dt->addMinutes(61); | 2012-01-31 01:01:00 |
echo $dt->subMinute(); | 2012-01-30 23:59:00 |
echo $dt->subMinutes(61); | 2012-01-30 22:59:00 |
addSeconds()
và subSeconds()
:
Lệnh | Output |
echo $dt->addSecond(); | 2012-01-31 00:00:01 |
echo $dt->addSeconds(61); | 2012-01-31 00:01:01 |
echo $dt->subSecond(); | 2012-01-30 23:59:59 |
echo $dt->subSeconds(61); | 2012-01-30 23:58:59 |
Qua phần này, ta thấy rằng việc điều chỉnh ngày và giờ trong PHP là rất dễ dàng với các hàm add
và subtract
của Carbon Laravel.
Getter và Setter trong Carbon Laravel
Một cách khác nữa để ta có thể thao tác với thời gian trong PHP là sử dụng getter và setter của Carbon Laravel.
Đọc giá trị bằng getter:
$dt = Carbon::now();
var_dump($dt->year);
var_dump($dt->month);
var_dump($dt->day);
var_dump($dt->hour);
var_dump($dt->second);
var_dump($dt->dayOfWeek);
var_dump($dt->dayOfYear);
var_dump($dt->weekOfMonth);
var_dump($dt->daysInMonth);
Thay đổi giá trị bằng setter:
$dt = Carbon::now();
$dt->year = 2015;
$dt->month = 04;
$dt->day = 21;
$dt->hour = 22;
$dt->minute = 32;
$dt->second = 5;
echo $dt;
Ta còn có thể xâu chuỗi các setter với nhau. Đưới dây là một số ví dụ với year()
, month()
, day()
, hour()
, minute()
, và second()
:
$dt->year(2015)->month(4)->day(21)->hour(22)->minute(32)->second(5)->toDateTimeString();
Sử dụng setDate()
và setTime()
:
$dt->setDate(2015, 4, 21)->setTime(22, 32, 5)->toDateTimeString();
Sử dụng setDateTime()
:
$dt->setDateTime(2015, 4, 21, 22, 32, 5)->toDateTimeString();
Tất cả những lệnh trên đều đưa ra cùng kết quả: 2015-04-21 22:32:05
.
Định dạng Date và Time
Các method toXXXString()
có thể hiển thị ngày và giờ với định dạng được xác định trước:
Lệnh | Output |
echo $dt->toDateString(); | 2015-04-21 |
echo $dt->toFormattedDateString(); | Apr 21, 2015 |
| 22:32:05 |
echo $dt->toDateTimeString(); | 2015-04-21 22:32:05 |
echo $dt->toDayDateTimeString(); | Tue, Apr 21, 2015 10:32 PM |
Ngoài ra còn có thể sử dụng DateTime
format()
trong PHP để tùy chỉnh định dạng:
echo $dt->format('l jS \of F Y h:i:s A');
Trong đó:
l
: Thể hiện đầy đủ các ngày trong tuần (dạng văn bản)jS
:- Ngày trong tháng, không có số 0 ở đầu
- Hậu tố trong tiếng Anh cho ngày của tháng, 2 ký tự
F
: Biểu diễn tháng ở dạng văn bảnY
: Biểu diễn năm ở dạng số với 4 chữ sốh:i:s
:- Định dạng 12 giờ, có số 0 ở đầu
- Phút, với số 0 ở đầu
- Giây, với số 0 ở đầu
A
: Định dạng AM – PM
Kết quả:
Tuesday 21st of April 2015 10:32:05 PM
Tính toán thời gian tương đối
Carbon Laravel cho phép ta hiển thị thời gian tương đối bằng các method diff(
).
Chẳng hạn, ta có một blog và muốn hiển thị thời gian đã đăng bài là 3 tiếng trước – 3 hours ago
. Bây giờ, ta sẽ thử làm bằng method trên.
Tìm độ chênh lệch
Xét ví dụ sau với Time ở hai mốc thời gian:
$dt = Carbon::create(2012, 1, 31, 0);
$future = Carbon::create(2012, 1, 31, 0);
$past = Carbon::create(2012, 1, 31, 0);
$future = $future->addHours(6);
$past = $past->subHours(6);
Kết quả của hàm diffInHours()
:
Lệnh | Output |
echo $dt->diffInHours($future); | 6 |
echo $dt->diffInHours($past); | 6 |
Xét ví dụ sau với Date ở hai mốc thời gian:
$dt = Carbon::create(2012, 1, 31, 0);
$future = Carbon::create(2012, 1, 31, 0);
$past = Carbon::create(2012, 1, 31, 0);
$future = $future->addMonth();
$past = $past->subMonths(2);
Kết quả của hàm diffInDays()
:
Lệnh | Output |
echo $dt->diffInDays($future); | 31 |
echo $dt->diffInDays($past); | 61 |
Hiển thị dưới dạng câu chữ
Bây giờ, ta có thể hiển thị kết quả sao cho người dùng dễ đọc hơn. Chẳng hạn như 3 hours ago. Ta sẽ dùng hàm diffForHumans()
để chuyển kết quả sang định dạng dễ đọc hơn.
Xét ví dụ với ngày ở hai mốc thời gian như sau:
$dt = Carbon::create(2012, 1, 31, 0);
$future = Carbon::create(2012, 1, 31, 0);
$past = Carbon::create(2012, 1, 31, 0);
$future = $future->addMonth();
$past = $past->subMonth();
Kết quả của hàm diffForHumans()
:
Lệnh | Output |
echo $dt->diffForHumans($future); | 1 month before |
echo $dt->diffForHumans($past); | 1 month after |
Như vậy là bạn đã hiểu và biết cách sử dụng Carbon Laravel, hy vọng qua bài viết này bạn có thêm nhiều kiến thức mới để cải thiện kỹ năng lập trình của mình, chúc bạn thành công!