2016-03-01 2 views
0

У меня странная проблема, с которой я никогда не сталкивался с PHP до использования их функции strtotime().Нужна помощь для ошибок вычисления PHP strtotime()

$original = strtotime('2015-12-31 12:34:56'); 
$time = strtotime('+ 2 month', $original); 
echo date('m/d/y H:i:s', $original),'<br>',date('m/d/y H:i:s', $time); 

Что я ожидаю получить в качестве вывода:

12/31/15 12:34:56 
02/29/16 12:34:56 

То, что я на самом деле получить в качестве вывода:

12/31/15 12:34:56 
03/02/16 12:34:56 

Как я могу объяснить эту ошибку расчета? После довольно много исследований я понимаю, что PHP использует в среднем 30,5 дней для выполнения таких расчетов. Мне все равно, о чем «ПОЧЕМУ» это происходит, а скорее, что я могу сделать, чтобы объяснить это. У меня есть некоторые соображения, связанные с написанием обертки для strtotime() при использовании месячных вычислений, но это похоже на запутанный подход ...

Существует существующий ответ для this question, но компонент времени не указан в вопрос (только дата), поэтому я не рассматриваю этот вопрос как дубликат этого. Кроме того, я в основном стараюсь улучшить то, как мы справляемся с такой проблемой, а не обязательно решение, отправленное по вышеупомянутому вопросу. Если, однако, я ошибаюсь, то вы можете удалить этот вопрос :(

+0

Поскольку месяц не является фиксированной длиной .... PHP не дает вам «последний день месяца через два месяца», он занимает произвольную длину месяца, которая будет работать в большинстве (но не всех) обстоятельствах .... если вы хотите, добавьте 2 месяца к первому дню месяца, затем запросите последнюю дату этого месяца –

ответ

2

Если вы хотите получить последнюю дату, вы можете использовать это поведение over/underflowing, другое путь:

$original = new DateTime('2015-12-31'); 
$modified = clone $original; 
$modified->modify('+2 months'); 
$modified->setDate($modified->format('Y'), $modified->format('m'), 0); 

echo $original->format('m/d/y H:i:s') . "<br>" .$modified->format('m/d/y H:i:s'); 

или проще

$date = explode('-', '2015-12-31'); 
$modified = new DateTime(); 
$modified->setDate($date[0], $date[1]+3, 0); 

Не самое красивое решение, но оно работает.

+0

Извините, если это звучит грубо, но мы не ваша персональная армия кодирования, поэтому, если вы получаете рабочий решение, принять его и улучшить его самостоятельно. Вычисления даты немного запутаны в PHP, поэтому для этой проблемы нет простого решения: http://stackoverflow.com/questions/14584115/php-strtotime-1-month-adding-an-extra-month – Tyr

2

В феврале нет 31 дня, поэтому переполненные дни будут продвигаться к маршу. Вы можете проверить эффект, если вы измените год с 2015 по 2014 год и выполнить код еще раз. Результат 2015-03-03 (февраль имеет 28 дней в 2015 году)

Смежные вопросы