Сколько дней составляет 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
Ответы
Ответ 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
отправляется в предыдущий месяц, в тот же день. Поскольку мы уже перематывали до первого дня месяца, это всегда будет работать, как ожидалось.