2015-02-05 9 views
6

Jeśli używam tego kodu mam dziwne wyniki:PHP Luty data: "2015-01-31" +1 miesiąc: "2015-03-30". Jak naprawić?

$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>"; 

uzyskać to:

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

i nie 2015-02-28.

Jak naprawić?

+0

@all: Czy jes Czy to prawdziwy błąd? To wyraźnie przełamuje użyteczność i zdecydowanie przełamuje wiele aplikacji. – Sliq

Odpowiedz

0

Jeśli chcesz uzyskać ostatniego dnia następnego miesiąca, można użyć:

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

go naprawić w ten sposób.

$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>"; 

Dostaniesz

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

Jesteś geniuszem, naprawdę !! GENIUSZ!!! GENIUSZ!!! –

+0

Niezupełnie .. to nie działa w ogóle. Tylko jeśli wiesz już, że masz do czynienia ze styczniem, a potem, dlaczego używasz 'DateTime', aby w ogóle dostać się do lutego? Znacznie lepiej jest wybrać proste rozwiązanie, które zawsze działa i zawsze wygląda tak samo, jak w przypadku mopo. –

+0

Żartuję, kiedy mówię, że jesteś geniuszem. –

3

drodze DateTime prace, + 1 month zwiększa wartość o jeden miesiąc, co daje 2015-02-31. Ponieważ w lutym jest tylko 28 lub 29 dni, zostanie to ocenione na kilka pierwszych dni marca. Potem, jak wiesz, prośba o Y-m-t da ci ostatni dzień marca.

Ponieważ używasz już t dostać ostatni dzień miesiąca, można uniknąć tego problemu przez począwszy z datą, która mieści się na początku miesiąca Zamiast:

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

Reference : PHP DateTime::modify adding and subtracting months

0

można spróbować tej funkcji, aby dodać miesięcy do obiektu 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