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

Bài viết hôm nay sẽ giải quyết câu hỏi làm thế nào tính được khoảng cách giữa 2 ngày bất kỳ và lấy kết quả trả về theo các mục đích khác nhau.

1) Tính khoảng cách giữa 2 ngày

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

  1. 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.
  2. 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).
  3. Lấy kết quả chia cho tổng số giây trong 1 ngày (24 x 60 x 60 = 86400).
  4. 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('2012-07-11');
$second_date = strtotime('2012-07-14');
$datediff = abs($first_date - $second_date);
echo floor($datediff / (60*60*24));
?>

Kết quả:

3

2) Lấy kết quả trả về theo định dạng 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à 01/01/2012 và 04/05/2014. Vậy hai ngày đó cách nhau bao nhiêu năm, tháng và ngày ?

a, Cách 1

<?php
$date1 = "2012-03-24";
$date2 = "2012-03-26";
$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 . " years, " . $months . " months, " . $days . " days";
?>

b, Cách 2 (Đoạn code này chỉ áp dụng cho PHP 5.3+)

<?php
$date1 = new DateTime("2012-03-24");
$date2 = new DateTime("2012-03-26");
$interval = $date1->diff($date2);
echo $interval->y . " years, " . $interval->m . " months, " . $interval->d . " days ";
?>

Và kết quả

0 years, 0 months, 2 days

3) Lấy kết quả trả về theo định dạng ngày, tháng, năm, giờ, phút, giâ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." years, ".$months." months, ".$days." days, ".$hours." hours, ".$minutes." minutes, ".$seconds." seconds";
?>

Và kết quả

1 years, 1 months, 2 days, 14 hours, 59 minutes, 1 seconds

Hi vọng bài viết này giúp ích cho các bạn. Thân ái!

Tấn Việt

Tôi lập trang web này để thỏa mãn sở thích viết cái gì đó vui vui khi rãnh rỗi và đồng thời cũng chia sẻ những gì tôi biết hoặc đọc đâu đó trên mạng về Lập trình web. Tôi hi vọng những bài viết này sẽ giúp ích cho các bạn. Thân ái!

You may also like…

2 Responses

  1. Mỹ lệ says:

    anh ơi! giúp e với ạ, e có 1 bài toán thế này
    Nhập 1 ngày hiện tại: thời gian lưu trữ: 20/09/2013
    1 selectbox bao gồm các giá trị: thời gian bảo quản:10 năm, 20 năm, 50 năm, 6 tháng
    bây giờ em muốn tính được số ngày còn lại của 1 bộ hồ sơ đó là bao nhiêu ngày thì tính thế nào ạ
    e tính là (thời gian bảo quản-(thời gian hiện tại — thời gian lưu trữ))

  2. huy says:

    cái này có đúng với năm 366 ngày không?