Подтвердить что ты не робот

Сколько дней составляет 1 месяц на PHP?

Я вижу, что в php есть странная проблема с добавлением и вычитанием месяца.

Мои вопросы:

1 месяц имеет эквивалент в днях? если да, является ли это общепринятым стандартом на всех языках программирования?

Несколько примеров:

echo date('Y-m-d',strtotime('2011-03-31 -1 months')); //2011-03-03
echo date('Y-m-d',strtotime('2011-03-30 -1 months')); //2011-03-02
echo date('Y-m-d',strtotime('2011-03-29 -1 months')); //2011-03-01
echo date('Y-m-d',strtotime('2011-03-28 -1 months')); //2011-02-28
4b9b3361

Ответ 1

Из ваших примеров, похоже, что он вычитает 1 из части месяца, а затем исправляет нелегальные даты. Второй пример:

2011-03-30 - 1 month = 2011-02-30. Эта дата не существует, поскольку в феврале 2011 года было всего 28 дней. 30 - 28 = 2, поэтому он помещает его как второй день следующего месяца.

Однако я не нашел документацию об этом.

В любом случае, если я прав, ответ на ваш вопрос no, "1 месяц" не имеет (постоянного) эквивалента в днях, это зависит от ввода.

Ответ 2

Здесь будет очень ценным способом strtotime анализировать информацию о дате.

То, что вам кажется нужным, - это первый день предыдущего месяца, верно?

Ну, вы можете связать многие из этих относительных команд. Например, из интерактивной оболочки PHP:

php > $d = date_create('2011-03-28 first day -1 month'); if($d) echo $d->format('Y-m-d H:i:s'); else echo "Failed.";
2011-02-01 00:00:00
php > $d = date_create('2011-03-29 first day -1 month'); if($d) echo $d->format('Y-m-d H:i:s'); else echo "Failed.";
2011-02-01 00:00:00
php > $d = date_create('2011-03-30 first day -1 month'); if($d) echo $d->format('Y-m-d H:i:s'); else echo "Failed.";
2011-02-01 00:00:00
php > $d = date_create('2011-03-31 first day -1 month'); if($d) echo $d->format('Y-m-d H:i:s'); else echo "Failed.";
2011-02-01 00:00:00
php > $d = date_create('2011-04-01 first day -1 month'); if($d) echo $d->format('Y-m-d H:i:s'); else echo "Failed.";
2011-03-01 00:00:00

first day запрашивает первый день текущего месяца. Запрос на -1 month отправляется в предыдущий месяц, в тот же день. Поскольку мы уже перематывали до первого дня месяца, это всегда будет работать, как ожидалось.