Đối với PHP> = 5,3
$d1 = new DateTime("2009-09-01");
$d2 = new DateTime("2010-05-01");
var_dump($d1->diff($d2)->m); // int(4)
var_dump($d1->diff($d2)->m + ($d1->diff($d2)->y*12)); // int(8)
DateTime :: diff trả về một đối tượng DateInterval
Nếu bạn không chạy với PHP 5.3 hoặc cao hơn, tôi đoán bạn' sẽ phải sử dụng dấu thời gian unix:
$d1 = "2009-09-01";
$d2 = "2010-05-01";
echo (int)abs((strtotime($d1) - strtotime($d2))/(60*60*24*30)); // 8
Nhưng không chính xác lắm (không có luôn 30 ngày mỗi tháng).
Điều cuối cùng: nếu những ngày đó đến từ cơ sở dữ liệu của bạn, thì hãy sử dụng DBMS của bạn để thực hiện công việc này, chứ không phải PHP.
Edit: Mã này nên chính xác hơn nếu bạn không thể sử dụng DateTime :: diff hoặc RDBMS của bạn:
$d1 = strtotime("2009-09-01");
$d2 = strtotime("2010-05-01");
$min_date = min($d1, $d2);
$max_date = max($d1, $d2);
$i = 0;
while (($min_date = strtotime("+1 MONTH", $min_date)) <= $max_date) {
$i++;
}
echo $i; // 8
Nguồn
2010-11-20 16:03:36
Giải pháp tuyệt vời trong vòng lặp while! Rất ngắn gọn và chính xác. Làm tốt! +1 –
Nếu bạn có hai ngày cách nhau hơn một năm, bạn sẽ thấy 'var_dump ($ d1-> diff ($ d2) -> m)' sẽ thất bại trong phương thức DateTime (phương thức trên cùng của câu trả lời này) vì nó sẽ chỉ hiển thị những tháng không thêm đến nhiều năm. Hãy thử điều này và xem điều gì xảy ra: '$ d1 = Ngày giờ mới (" 2011-05-14 "); ' ' $ d2 = new DateTime ("2013-02-02"); ' ' $ d3 = $ d1 -> diff ($ d2); ' ' echo '
'; ' – pathfinderKhông quá nhanh ... dựa vào strtotime có thể làm bạn đau đầu. Có bao nhiêu tháng từ ngày 31 tháng 1 năm 2011 đến ngày 28 tháng 2 năm 2011? –