DateTime добавление интервала дает неправильный ответ

2Хотя получить следующий месяц, добавив +1 month в функции strtotime также и в классе DateTime, который не дает правильного ответа, когда время начала даты — 31 января 2011 года.

<?php

$StartDateline = new DateTime("31 January 2011");

echo date('Y-m-d', $StartDateline->getTimestamp());
echo "<br>";
$EndDateline = $StartDateline->add(new DateInterval("P1M"));//strtotime("+1 month", $startDateline);

echo date('Y-m-d', $EndDateline->getTimestamp());

echo "<br>";

?>

Выход:

2011-01-31
2011-03-03

Ожидаемый результат должен быть следующим или как мне получить следующее:

2011-01-31
2011-02-28

Спасибо

0

Решение

Это работает:

<?php
$StartDateline = new DateTime("31 January 2011");
echo date('Y-m-d', $StartDateline->getTimestamp());
echo "<br>";

$test = $StartDateline->modify('last day of next month');
echo date('Y-m-d', $test->getTimestamp());
echo "<br>";
?>

результат:

2011-01-31
2011-02-28

Вот похожий ответ это объясняет, почему ваш путь не дает желаемого результата.

PHP документы на DateTime :: изменить метод

редактировать:
Теперь я понимаю, что вам нужен не последний день следующего месяца, а тот же день следующего месяца.
Я нашел этот код работает:

function addMonthsToTime($numMonths = 1, $timeStamp = null){
$timeStamp === null and $timeStamp = time();//Default to the present
$newMonthNumDays =  date('d',strtotime('last day of '.$numMonths.' months', $timeStamp));//Number of days in the new month
$currentDayOfMonth = date('d',$timeStamp);

if($currentDayOfMonth > $newMonthNumDays){
$newTimeStamp = strtotime('-'.($currentDayOfMonth - $newMonthNumDays).' days '.$numMonths.' months', $timeStamp);
} else {
$newTimeStamp = strtotime($numMonths.' months', $timeStamp);
}

return $newTimeStamp;
}

$timestamp = strtotime('2011-01-01');
echo date('m/d/Y', addMonthsToTime(1, $timestamp));
//02/01/2011

$timestamp = strtotime('2011-01-31');
echo date('m/d/Y', addMonthsToTime(1, $timestamp));
//02/28/2011

взято из этот раздел комментариев по PHP Относительные форматы страница документа.

0

Другие решения

вместо указания month уточнить date,

new DateInterval("P#D")// # no. of days.

или вы можете использовать modify.посмотреть здесь:http://php.net/manual/en/datetime.modify.php

0

Текущее поведение PHP DateTime не является неправильным. Что на самом деле происходит

  • +1 месяц увеличивает номер месяца (первоначально 1) на единицу. Это делает дату 2011-03-03.
  • Второй месяц (февраль) имеет только 28 дней в 2011 году, поэтому PHP
    автоматически исправляет это, просто продолжая считать дни с февраля
    Первый. Затем вы в конечном итоге на 3 марта. 31 января + 31 день (1 месяц) = 3 марта (поскольку в феврале только 28 дней)

    Увидеть @shamittomar

Чтобы получить ожидаемый ответ, вы должны использовать количество дней

  • Вот почему в PHP Manual DateTime говорит, что будьте осторожны при добавлении месяцев.

Так что просто замени P1M с P28D получить желаемый результат

$EndDateline = $StartDateline->add(new DateInterval("P28D"));

Смотрите ДЕМО

0

Джон Робертсон уже объяснил, почему вы получаете результат, который вы получаете. Вывод правильный, потому что, когда вы добавляете +1 месяц к 31.1. это станет 31.2. который 3 days больше, чем 28.2.так что правильные результаты 3.3.,

Для ваших нужд вам понадобится специальный скрипт, который будет обрабатывать перенос по вашему пути, например:

$start = new DateTime('31 January 2011');

$new   = clone $start;
$new->modify('first day of next month');
$newDay = ($start->format('j') > $new->format('t') ? $new->format('t') : $start->format('j')) - 1;
$new->modify("+{$newDay} days");

echo $start->format('Y-m-d'), " > ", $new->format('Y-m-d');

демонстрация

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector