07/09/2018, 10:41

Các tính năng hữu dụng của đối tượng DateTime trong PHP không phải dev nào cũng biết

Làm việc với ngày giờ quả là không mấy dễ chịu cho chúng ta là các lập trình viên, nhất là các deadline (tuy nhiên là bài viết này không đề cập tới deadline). Nếu như bạn không phải là một dev hay làm biếng thì các task yêu cầu đếm số lượng record trong khoảng một thời gian nhất định như một ...

Làm việc với ngày giờ quả là không mấy dễ chịu cho chúng ta là các lập trình viên, nhất là các deadline (tuy nhiên là bài viết này không đề cập tới deadline).

Datetime trong PHP

Nếu như bạn không phải là một dev hay làm biếng thì các task yêu cầu đếm số lượng record trong khoảng một thời gian nhất định như một ngày, một tuần... sẽ không mấy xa lạ. Tuy nhiên dữ liệu ngày tháng xuất hiện trong ứng dụng có thể được lấy từ hệ quản trị cơ sở dữ liệu (thường sẽ là MySQL), từ input người dùng hay đơn giản từ code thuần khi lập trình PHP. Mỗi hệ thống khác nhau có các cách lưu trữ dữ liệu kiểu ngày tháng khác nhau và điều này khiến cho việc xử lý các tác vụ có dính dáng tới dữ liệu ngày tháng không phải lúc nào cũng diễn ra suôn sẻ. Hãy cùng nhau tìm hiểu một số tính năng hữu dụng để giải quyết các bài toán thông dụng khi chúng ta cần làm việc với các dữ liệu liên quan tới ngày tháng.

So Sánh Ngày Tháng

Giả sử bạn cần so sánh hai ngày được lấy từ dữ liệu input trong form gửi tới server. Và thông thường các dữ liệu này thường được gửi dưới dạng chuỗi:

$date1= "26-11-2017";
$date2= "07-12-2017";

Lúc này nếu như so sánh trực tiếp:

var_dump($date1 > $date2); // true

Thì kết quả nhận được sẽ không chính xác. Để so sánh hai dữ liệu ngày tháng dạng chuỗi chúng ta cần chuyển về kiểu dữ liệu DateTime trong PHP trước:

$date1= "26-11-2017";
$date2= "07-12-2017";

$myDateTime1 = new DateTime($date1);
$myDateTime2 = new DateTime($date2);

var_dump($myDateTime1 > $myDateTime2); // false

Hiển Thị Theo Format

Cần hiển thị một ngày tháng lưu theo dạng chuỗi từ format này sang format khác, ví dụ như chuỗi đã cho là:

$date= "26-11-2017";

Và giờ cần hiển thị về format dạng: thứ trong tuần -> theo sau bởi ngày -> theo sau bởi tháng và theo sau bởi năm.

Vâng và khi nhận được yêu cầu như vậy thì rất nhiều dev đã ngay lập tức vật lộn trên Google để tìm ra thư viện hỗ trợ thực hiện thao tác này!? Không cần thư viện nào cả vì trong đối tượng DateTime đã cung cấp sẵn phương thức format() để chúng ta làm điều này rồi:

$date= "26-11-2017";

$myDate = new DateTime($date);
echo $myDate->format("l d, m, Y"); // Sunday 26, 11, 2017

Đơn giản như ăn bánh phải không nào.

Và nếu như bạn muốn thêm tiếp vị ngữ trước số ngày như đã từng học trong môn tiếng Anh:

echo $myDate->format("l dS, M, Y"); // Sunday 26th, Nov, 2017

Quá easy phải không nào :)

Cài Đặt Timezone

Sử dụng Timezone là điều cần thiết đặc biệt khi làm việc với ngày giờ (lưu ý là ở đây có thêm cả giờ nữa) vì timezone không phải lúc nào cũng giống nhau. Ví dụ code của bạn chạy ở môi trường server được đặt theo múi giờ Việt Nam nhưng khách hàng sử dụng ứng dụng lại đang ở Singapore chẳng hạn.

Để cài đặt múi giờ chúng ta có thể sử dụng phương thức setTimezone() của DateTime kết hợp với đối tượng DateTimeZone:

$date = new DateTime('2013-12-01');
$date->setTimezone(new DateTimeZone('Asia/Ho_Chi_Minh'));
echo $date->format('Y-m-d H:i:s');

Bạn có thể vào địa chỉ http://php.net/manual/en/timezones.asia.php để xem danh sách các timezone sử dụng trong PHP.

Chỉnh Sửa Ngày

Bạn có một chuỗi ngày tháng, ví dụ như là 26-11-2017, giờ cần biết một tuần sau sẽ là ngày nào thì phải làm sao?

$date= "26-11-2017";

$myDate = new DateTime($date);

$myDate->modify("+7 days");

echo $myDate->format("l, d, m, Y"); // Sunday 03rd, 12, 2017

Đơn giản vậy sao? Đúng thế và không chỉ có vậy bạn còn có thể thử với các câu lệnh sau:

$myDate->modify("+1 week");
$myDate->modify("+1 month");
$myDate->modify("next week");
$myDate->modify("next month");
$myDate->modify("tomorrow");

Và tất nhiên có cộng thì cũng có trừ:

$myDate->modify("-30 days");
$myDate->modify("yesterday");
$myDate->modify("previous month");
$myDate->modify("last month");

Có ngày thì cũng có giờ có phút:

$date= "26-11-2017 06:00:00";

$myDate = new DateTime($date);

echo $myDate->format("H:m:s  dS, m, Y");

$myDate->modify("+1 hour");

echo $myDate->format("s:m:H  dS, m, Y");

Nếu như bạn ưa chuộng code theo kiểu functional thì có thể dùng hàm date_modify().

Ngày Cuối Cùng Của Tháng

Cuối cùng thì bạn cũng có thể sử dụng phương thức modify() để nhanh chóng lấy ra ngày của tháng.

$date = new DateTime('now');
$date->modify('last day of this month');

Rồi anh Lương đã đến rồi đi nhậu thôi.

Chưa nhanh vậy đâu giờ mới đầu tháng :)

0