2009-07-31 23 views
11

Điều này đã hoạt động tốt ngày hôm qua mà không có thay đổi đối với mã.PHP Strtotime -1month -2month

echo date("M", strtotime("-3 month", time())); 
echo date("M", strtotime("-2 month", time())); 
echo date("M", strtotime("-1 month", time())); 
echo date("M", time()); 

Sản lượng nó được sản xuất ngày hôm qua đã như bạn sẽ expect- ví dụ: tháng tư, tháng năm, tháng sáu, tháng bảy

Hôm nay nó vang tháng tháng tháng bảy tháng bảy

Bất kỳ ý tưởng?

Xin cảm ơn trước.

+3

Hôm nay, chúng tôi là ngày thứ 31; có thể có một cái gì đó liên quan đến đó ^^ –

Trả lời

11

Nó có thể liên quan đến lỗi #44073

Bạn có thể thử với một cái gì đó như thế này:

echo date("M", strtotime("-3 month", strtotime(date("F") . "1"))) . "\n"; 
echo date("M", strtotime("-2 month", strtotime(date("F") . "1"))) . "\n"; 
echo date("M", strtotime("-1 month", strtotime(date("F") . "1"))) . "\n"; 
echo date("M", time()) . "\n"; 

(Giải pháp được tìm thấy trong phần ý kiến ​​của strtotime; direct link)

Và đầu ra:

Apr 
May 
Jun 
Jul 

Loại "gian lận" với định dạng ngày tháng và tên tháng và tất cả những gì ...

4

Hãy thử điều này thay vì strtotime:

mktime(0, (date("n") - 3 + 12) % 12, 1) 

Ý tưởng là để có những số tháng hiện tại (date("n")), trừ số tháng bạn muốn (ở đây -3), thêm 12 vào nó và sau đó nhận modulo 12.

+0

giải pháp tốt đẹp, rất sạch sẽ –

3

Đây là hành vi đã biết và được mong đợi. Lý do cho điều này là tháng là ngày tương đối không có độ dài cố định. Từ http://www.gnu.org/software/tar/manual/html_node/Relative-items-in-date-strings.html#SEC120

Đơn vị chuyển thời gian có thể được chọn theo chuỗi 'năm' hoặc 'tháng' để di chuyển cả năm hoặc tháng. Đây là những đơn vị mờ, theo năm và tháng không phải là tất cả thời gian bằng nhau. Đơn vị chính xác hơn là 'hai tuần' trị giá 14 ngày, 'tuần' trị giá 7 ngày, 'ngày' trị giá 24 giờ, 'giờ' trị giá 60 phút, 'phút' hoặc 'phút' trị giá 60 giây và 'giây' hoặc 'giây' đáng giá một giây. Hậu tố ‘s’ trên các đơn vị này được chấp nhận và bỏ qua.

Do đó (tôi nhấn mạnh)

Các lông tơ trong các đơn vị có thể gây ra vấn đề với các vật phẩm tương đối. Ví dụ: '2003-07-31 -1 tháng' có thể đánh giá đến 2003-07-01, bởi vì 2003-06-31 là ngày không hợp lệ. Để xác định tháng trước đáng tin cậy hơn, bạn có thể yêu cầu tháng trước ngày 15 của tháng hiện tại.Ví dụ:

$ date -R 
Thu, 31 Jul 2003 13:02:39 -0700 
$ date --date='-1 month' +'Last month was %B?' 
Last month was July? 
$ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!' 
Last month was June! 

ở trên có thể được thể hiện bằng PHP như

echo date('M', strtotime(date('Y-m-') . '15 -1 month')); 

Cũng thấy commments dưới http://bugs.php.net/bug.php?id=22486

0

một cách đơn giản có thể là để viết nó như thế này

ngày echo ("M", strtotime ("năm nay +3 tháng"));

hoặc

ngày echo ("M", strtotime ("tháng này -3 tháng"));

phụ thuộc vào những gì bạn sử dụng nó cho ..

7

Gorden đã xác định chính xác vấn đề, nhưng tôi muốn đưa ra một giải pháp hữu ích và không mang tính kỹ thuật. Chỉ cần sử dụng "ngày đầu tiên" hoặc "ngày cuối cùng của" trong strtotime của bạn. Ex, những ví dụ sau đây khắc phục vấn đề này trên 31 tháng:

// Today is May 31st 
//All the following return 2012-04-30 
echo date('Y-m-d', strtotime("last day of -1 month")); 
echo date('Y-m-d', strtotime("last day of last month")); 
echo date_create("last day of -1 month")->format('Y-m-d'); 

// All the following return 2012-04-01 
echo date('Y-m-d', strtotime("first day of -1 month")); 
echo date('Y-m-d', strtotime("first day of last month")); 
echo date_create("first day of -1 month")->format('Y-m-d'); 
2

Từ PHP 5.3 (Ref: https://bugs.php.net/bug.php?id=44073) và cao hơn bạn có thể làm:

"first day of +1 month" hoặc "first day of next month" hoặc thậm chí " last day of next month "

Ví dụ:

$date = '2015-12-31'; 

echo date("Y-m-d", strtotime($date ."first day of previous month")); 

Sẽ tạo ra: 2015-11-01 này không tính toán ngày trên cơ sở thời gian 30 ngày.

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