В формате относительного времени PHP strtotime есть ошибка (или функция?)

Я обнаружил, что strtotime ведет себя странно при использовании формата относительного времени.

Предположим, что сегодня 31 марта 2015 года (выполняется путем установки системных часов), когда я использую strtotime('-1 month'), он возвращает 3 марта 2015 года.

Предположим, что сегодня 31 июля 2015 года, когда я использую strtotime('-1 month'), он возвращает 1 июля 2015 года, а возвращает 31 июля 2015 года, если сегодня 31 августа 2015 года.

Итак, похоже, что PHP просто вычитает 1 месяц и добавляет дату обратно, если в этом месяце нет 31-го дня (или 30-го и 29-го для февраля). Это ошибка PHP? Или есть причина, по которой PHP делает это как функцию?

И, что наиболее важно, независимо от того, ошибка это или особенность, есть ли способ заставить его всегда возвращать последний день при вычислении времени? (может быть -3 месяца или другое количество месяцев, поэтому «последний день прошлого месяца» не подходит)


person cytsunny    schedule 15.07.2015    source источник
comment
Начните с определения, что именно означает -1 месяц 31-го числа. Это настолько бессмысленное определение, что я бы никогда не ожидал, что какое-либо программное обеспечение сделает его правильным с самого начала.   -  person deceze♦    schedule 15.07.2015


Ответы (1)


Что-то вроде этого?

<?php
$d = new DateTime( '2010-01-08' );
$d->modify('+1 month');
$d->modify( 'last day of this month' );
echo $d->format('d-M-Y'), "\n";
?>
person Sotiris Kiritsis    schedule 15.07.2015
comment
Что делать, если это -1 месяц? Это ничего не даст, если $ d = new DateTime ('2010-03-01'); - person cytsunny; 15.07.2015
comment
Не уверен, что вы имеете в виду. Просто измените дату на «2010-03-01», как вы сказали, и измените ее на «-1 месяц». Результат такой, как ожидалось. - person Sotiris Kiritsis; 15.07.2015
comment
ops, извините, проблема должна быть 31 марта 2010 г. - person cytsunny; 15.07.2015
comment
Я немного попробовал поискать его, и это даже происходит при работе с отметками времени. Не уверен, в чем дело. - person Sotiris Kiritsis; 15.07.2015
comment
Ну вот почему я спрашиваю. Не могли бы вы удалить ответ? Наличие ответа делает вопрос менее заметным для окружающих со стороны. Они будут думать, что кто-то уже решил проблему. - person cytsunny; 15.07.2015