2015-02-05 42 views
6

Nếu tôi sử dụng mã này tôi nhận được kết quả kỳ lạ:Ngày tháng 2 PHP: "2015-01-31" +1 tháng: "2015-03-30". Làm thế nào để khắc phục?

$datetime = new DateTime('2015-01-31'); 
$datetime->modify('+1 month'); 
echo $datetime->format('Y-m-t') . "<br>"; 
$datetime->modify('+1 month'); 
echo $datetime->format('Y-m-t') . "<br>"; 
$datetime->modify('+1 month'); 
echo $datetime->format('Y-m-t') . "<br>"; 

tôi có được điều này:

2015-03-31 
2015-04-30 
2015-05-31 

Và không 2015-02-28.

Cách khắc phục?

+0

@all: Liệu thi s một lỗi thực sự? Điều này rõ ràng là phá vỡ khả năng sử dụng và dứt khoát phá vỡ rất nhiều ứng dụng. – Sliq

Trả lời

0

Nếu bạn muốn để có được những ngày cuối cùng của tháng tiếp theo, bạn có thể sử dụng:

$datetime->modify('last day of next month'); 
0

Khắc phục sự cố như thế này.

$datetime = new DateTime('2015-01-31'); 
$datetime->modify('28 days'); 
echo $datetime->format('Y-m-t') . "<br>"; 
$datetime->modify('+1 month'); 
echo $datetime->format('Y-m-t') . "<br>"; 
$datetime->modify('+1 month'); 
echo $datetime->format('Y-m-t') . "<br>"; 

Bạn sẽ nhận được

2015-02-28 
2015-03-31 
2015-04-30 
+2

Bạn là thiên tài, thực sự !! THIÊN TÀI!!! THIÊN TÀI!!! –

+0

Không thực sự .. điều này không làm việc nói chung. Chỉ khi bạn đã biết rằng bạn đang đối phó với tháng Giêng, và sau đó, tốt, tại sao sử dụng 'DateTime' để giúp bạn đến tháng hai ở tất cả? Tốt hơn hết là chọn một giải pháp đơn giản luôn hoạt động và luôn giống nhau, như mopo được đăng. –

+0

Tôi đang nói đùa khi tôi nói rằng bạn là thiên tài. –

3

Cách DateTime công trình, + 1 month tăng giá trị trong tháng một, đem lại cho bạn 2015-02-31. Vì chỉ có 28 hoặc 29 ngày trong tháng Hai, điều đó sẽ đánh giá vào những ngày đầu của tháng Ba. Sau đó, như bạn biết, yêu cầu Y-m-t sẽ cung cấp cho bạn ngày cuối cùng của tháng 3.

Kể từ khi bạn đã sử dụng t để có được những ngày cuối cùng của tháng, bạn có thể tránh được vấn đề này bằng bắt đầu với một ngày đó rơi vào đầu của một tháng thay vì:

$datetime = new DateTime('2015-01-01'); 

Reference : PHP DateTime::modify adding and subtracting months

0

Bạn có thể thử chức năng này để thêm tháng đến một đối tượng datetime

/** 
* 
* @param \DateTime $date DateTime object 
* @param int $monthToAdd Months to add at time 
*/ 
function addMonth(\DateTime $date, $monthToAdd) 
{ 
    $year = $date->format('Y'); 
    $month = $date->format('n'); 
    $day = $date->format('d'); 

    $year += floor($monthToAdd/12); 
    $monthToAdd = $monthToAdd % 12; 
    $month += $monthToAdd; 
    if ($month > 12) { 
     $year ++; 
     $month = $month % 12; 
     if ($month === 0) { 
      $month = 12; 
     } 
    } 

    if (! checkdate($month, $day, $year)) { 
     $newDate = \DateTime::createFromFormat('Y-n-j', $year . '-' . $month . '-1'); 
     $newDate->modify('last day of'); 
    } else { 
     $newDate = \DateTime::createFromFormat('Y-n-d', $year . '-' . $month . '-' . $day); 
    } 
    $newDate->setTime($date->format('H'), $date->format('i'), $date->format('s')); 

    return $newDate->format('Y-m-d'); 
} 

echo addMonth(new \DateTime('2015-01-30'), 1); //2015-02-28 
echo addMonth(new \DateTime('2015-01-30'), 2); //2015-03-30 
echo addMonth(new \DateTime('2015-01-30'), 3); //2015-04-30 
Các vấn đề liên quan