Thiết kế website PHP / MYSQL / MYSQLi

Tính khoảng cách giữa 2 ngày bất kỳ bằng PHP

  • by mr.T 07/07/2020
  • 6,389

Việc tạo ra Datetime để phục vụ cho tính toán ngày tháng, show ngày tháng trong PHP đã quá dễ dàng. Tuy nhiên, nếu cho 2 mốc thời gian và tính khoảng cách giữa 2 ngày đó thì không phải ai cũng nghĩ ra.

Dưới đây, Trung Trịnh .Com sẽ hướng dẫn các bạn tính khoảng cách giữa 2 ngày, khoảng cách giữ một ngày trong quá khứ đến hiện tại, khoảng cách một ngày trong quá khứ đến một ngày trong tương lai.


1. Tính khoảng cách giữa 2 ngày đơn giản nhất

Thuật toán được mô tả như sau :

Dùng hàm strtotime() để tính ra số giây được tính từ thời điểm 01/01/1970 00:00:00 GMT đến hiện tại của 2 ngày được nhập vào.

Dùng hàm abs() để lấy giá trị tuyệt đối của hiệu 2 ngày đó (vì không biết ngày nào lớn hơn).

Lấy kết quả chia cho tổng số giây trong 1 ngày (24 x 60 x 60 = 86400).

Cuối cùng sử dụng hàm floor() để làm tròn số ngày trả về.

Và đây là đoạn code:

<?php
  $first_date = strtotime('2020-07-06');
  $second_date = strtotime('2020-07-15');
  $datediff = abs($first_date - $second_date);
  echo floor($datediff / (60*60*24));
?>

Kết quả cho ra: 9


2. Tính khoảng cách giữa 2 ngày theo đơn vị ngày, tháng, năm

Các bạn có thể thấy kết quả trả về của đoạn code ở trên là khoảng cách (số ngày) giữa 2 ngày nhập vào. Câu hỏi đặt ra làm thế nào tính chính xác khoảng cách đó ra ngày, tháng, năm. Nói một cách dễ hiểu là, giả sử tôi nhập vào 2 ngày là 06/07/2020 và 15/07/2020. Vậy hai ngày đó cách nhau bao nhiêu năm, tháng và ngày ?

Cách 1

<?php
  $date1 = "2020-07-06";
  $date2 = "2020-07-15";
  $diff = abs(strtotime($date2) - strtotime($date1));
  $years = floor($diff / (365*60*60*24));
  $months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
  $days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));
  echo $years . " năm, " . $months . " tháng, " . $days . " ngày";
?>

Cách 2 (PHP 5.3+)

<?php
  $date1 = new DateTime("2020-07-06");
  $date2 = new DateTime("2020-07-15");
  $interval = $date1->diff($date2);
  echo $interval->y . " năm, " . $interval->m . " tháng, " . $interval->d . " ngày ";
?>

Và kết quả

0 năm, 0 tháng, 9 ngày


3. Trả về số ngày, tháng, năm, giờ, phút, giây giữa 2 ngày

Tương tự như vậy, đoạn code dưới đây sẽ tính chính xác khoảng cách giữa 2 ngày ra định dạng ngày, tháng, năm, giờ, phút, giây.

<?php
  $date1 = "2008-11-01 22:45:00";
  $date2 = "2009-12-04 13:44:01";

  $diff = abs(strtotime($date2) - strtotime($date1));

  $years = floor($diff / (365*60*60*24));
  $months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
  $days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24) / (60*60*24));
  $hours = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24) / (60*60));
  $minutes = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60) / 60);
  $seconds = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24 - $days*60*60*24 - $hours*60*60 - $minutes*60));
  echo $years." năm, ".$months." tháng, ".$days." ngày, ".$hours." giờ, ".$minutes." phút, ".$seconds." giây";
?>

Và kết quả

1 năm, 1 tháng, 2 ngày, 14 giờ, 59 phút, 1 giây


Bạn đang xem bài viết tại chuyên mục PHP / MYSQL / MYSQLi của Website Trung Trịnh. Nếu thấy bổ ích, hãy bấm like và share để chia sẻ cho mọi người cùng xem nhé!

BÌNH LUẬN

BÀI VIẾT KHÁC