2011-11-11 45 views
5

Tôi mong đợi chức năng này trả lại 6/30/2005 thay vì 7/1/2005.php: strtotime ("31/12/2004 +6 tháng")); không quay trở lại ngày cuối cùng của tháng

print date("m/d/Y", strtotime("12/31/2004 +6 month")); 

Tương tự, lợi nhuận print date("m/d/Y", strtotime("1/31/2011 +1 month"))03/03/2011 khi muốn nó trở lại 2/28/2011.

Có ai biết nếu có cách thẳng về phía trước để hiển thị ngày cuối cùng của tháng được thêm vào không?

+0

'strtotime' hoạt động với ngày theo phong cách châu Âu, nếu tôi nhớ chính xác. thử '31/1/2011', v.v. –

Trả lời

6

Làm thế nào về điều này?

echo date("m/d/Y", strtotime("last day of 12/31/2004 + 6 month")); // 6/30/2005 
echo date("m/d/Y", strtotime("last day of 1/31/2011 + 1 month")); // 2/28/2011 

Demo

Edit: Đối với các bạn tham khảo, đây là một liên kết đến documentation for relative times.

0

Một cách đơn giản là thực sự đi một tháng trước ngày bạn muốn và sau đó đặt giá trị ngày bằng không. Ngoài ra, mktime() có thể dễ dàng hơn

$mymonth = 2; // I want the last day of February 
echo date('m/d/Y', mktime(0,0,0,$mymonth+1,0,2011)); 

Điều này sẽ trở lại 2/28/2011.

2

như strtotime tiếp tục đến vào tháng tới nếu không có ngày enoghe tháng đó, bạn có thể sao 6 tháng và kiểm tra xem kết thúc của nó lên vào ngày bắt đầu

$date2 = date("Y-m-d", strtotime("{$date} +6 months")); 
    $date3 = date("Y-m-d", strtotime("{$date2} -6 months")); 
    if($date3 != $date) 
    { 
    $date2 = date("Y-m-t", strtotime("{$date2} -1 months")); 
    } 

(hoặc trong trường hợp của bạn " m/t/Y ")

0

strtotime làm tốt nhất có thể với thông tin xung đột. Nói

1/31/2011 +1month 

có nghĩa là tiến tới

2/31/2011 

nhưng tháng hai chỉ có 28 (đôi khi 29) ngày. Năm 2011 không phải là năm nhuận, do đó, "ngày 31 tháng 2" được chuẩn hóa thành "ngày 3 tháng 3".

Điều tương tự cũng áp dụng cho '12/31/2004 + 6 tháng '. Điều đó sẽ đưa bạn đến ngày 31 tháng 6 năm 2005. Nhưng tháng sáu chỉ có 30 ngày, vì vậy ngày được bình thường hóa đến ngày 1 tháng 7 để thay thế.

Các vấn đề liên quan