Hotline : 07 088 44444
Thích
Chia sẻ

Hướng dẫn sử dụng Carbon trong Laravel - Xử lý datetime trong Laravel và PHP

09/09/2021

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

Carbon 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ờ.

Không chần chờ thêm nữa, hãy bắt đầu cài đặt Carbon và khám phá khả năng của nó ngay thôi!

Đ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() 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() subYears() có kết quả như sau:

LệnhOutput
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()subMonths():

LệnhOutput
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()subDays():

LệnhOutput
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() subWeekdays():

LệnhOutput
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()subWeeks():

LệnhOutput
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()subHours():

LệnhOutput
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() subMinutes():

LệnhOutput
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()subSeconds():

LệnhOutput
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 addsubtract của Carbon Laravel.

Getter và Setter trong Carbon Laravel

cài đặt Getter và Setter trong Lavarel

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ệnhOutput
echo $dt->toDateString();2015-04-21
echo $dt->toFormattedDateString();Apr 21, 2015
echo $dt->toTimeString();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ản
  • Y: 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ệnhOutput
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ệnhOutput
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ệnhOutput
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!

Nếu bạn có thắc mắc hay có vấn đề cần hỗ trợ, bạn có thể liên hệ trực tiếp với Vietnix thông qua các kênh sau:
  • Hotline: 1800 1093 - 07 088 44444
  • Email: support@vietnix.vn
  • Hoặc chat trực tiếp với Vietnix thông qua biểu tượng Livechat ở góc phải màn hình. Đội ngũ chuyên viên của chúng tôi luôn sẵn sàng tư vấn và hỗ trợ bạn 24/7.
Vietnix hiện đang có chương trình khuyến mãi lớn nhất trong năm, giảm giá TRỌN ĐỜI: Đăng ký dùng thử ngay và Vietnix sẽ hoàn tiền 100% nếu quý khách không hài lòng với chất lượng sản phẩm, dịch vụ!
Mình là Bo - admin của Quản Trị Linux. Mình đã có 10 năm làm việc trong mảng System, Network, Security và đã trải nghiệm qua các chứng chỉ như CCNP, CISSP, CISA, đặc biệt là chống tấn công DDoS. Gần đây mình trải nghiệm thêm Digital Marketing và đã hòan thành chứng chỉ CDMP của PersonVUE. Mình rất thích được chia sẻ và hỗ trợ cho mọi người, nhất là các bạn sinh viên. Hãy kết nối với mình nhé!
Bài viết liên quan
Không có bài viết liên quan
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments