какой месяц предшествует настоящему (даты)

kpuk

Новичок
какой месяц предшествует настоящему (даты)

столкнулся на днях с проблемой.
почему на дня, сейчас поясню.

необходимо мне было в автоматическом режиме узнать, какой месяц предшествует настоящему.
например:
сегодня 31 марта 2006 года, месяц предшествующий февраль.
как делаю:
PHP:
$month=date("m",mktime (0,0,0,date("m")-1,date("d"),date("Y")));
все бы хорошо, но вот после 28 марта заметил что месяц стал равняться 03! а не 02!
а все потому что в предшествующем месяце было 28 дней....
я и не предполагал что он отнимет 28 дней а не просто месяц!
как решить задачу?

есть конечно вариант:
PHP:
$m=date("m",mktime (0,0,0,date("m"),date("d"),date("Y")));
$month=($m-1)
но это не будет работать с Январем! от 01-1 будет 0 а не 12

спасибо всем
 

bkonst

.. хочется странного?...
Что мешает дописать
PHP:
if ($month == 0) { 
  $month = 12; 
}
?
 

Фанат

oncle terrible
Команда форума
хм.
и правда.

ну, как воркараунд можно посоветовать
$month=date("m",mktime (0,0,0,date("m")-1,15));
 

bkonst

.. хочется странного?...
Фанат
Проверял? PHP 4.4.0 и 5.1.1, 31 марта:
PHP:
var_dump(date("Y-m-d", strtotime("1 month ago")));
var_dump(date("m",mktime (0,0,0,date("m")-1,date("d"),date("Y"))));
Код:
'2006-03-03' (length=10)
'03' (length=2)
 

Breeze

goshogun
Команда форума
Партнер клуба
а что по вашему должно выдать вот это:

mktime (0,0,0,2,31,2006)
 

bkonst

.. хочется странного?...
Не знаю, как mktime, но вот это:
PHP:
strtotime("1 month ago");
точно должно работать по другому. Или уж не работать вообще, дабы не вводить в заблуждение.
 

Breeze

goshogun
Команда форума
Партнер клуба
1 month == 31 days

var_dump(date("Y-m-d", strtotime("4 month ago")));
var_dump(date("Y-m-d", strtotime("3 month ago")));
 

bkonst

.. хочется странного?...
Большая часть людей фразу "месяц назад/1 month ago" в последний месяца воспринимают как "последний день предыдущего месяца". Не думая о том, сколько месяцев в текущем/предыдущем месяцах. (Я с этим сталкивался при написании мини-календаря на PHP).

Если поведение mktime еще можно понять - в конце концов, никто не гарантирует, что функция вернет корректное значение, если ей скормили ересь, то strtotime заявляет, что она "Parse about any English textual datetime description into a Unix timestamp". И уж говорить, что "1 month ago" - это не "textual datetime description" - это слишком.

~~~

А уж допущение 1 месяц == 31 день - вообще недопустимо в любом приложении, работающем с датами. Представь себе, что ты записал в себе органайзер событие, происходящее каждый месяц 15го числа - а оно уже на второй-третий раз "уползло". Какими словами будет охарактеризован разработчик?
 

kpuk

Новичок
bkonst
видимо пока с if_ами придется работать.
единственный вариант.
не думал что придется ТАК увеличивать код только из-за месяца :)
PS
просто у меня там несколько месяцев рассчитывается...
 

kpuk

Новичок
Фанат

к стати... сейчас проверил, работает
PHP:
$month=date("m",mktime (0,0,0,date("m")-1,15));
но вот почему? что это за 15 в конце?
 

bkonst

.. хочется странного?...
kpuk
15 - середина месяца. Гарантированно есть даже в феврале :)
 

kpuk

Новичок
мммм.... нууу... тема слушай :)
точно :) спасибо
то что надо! (в данном решении)
 

kpuk

Новичок
SiMM
ммм... а пояснить? а то мне это не знакомо совсем

я вот отнял 6 месяцев сейчас - и вышло -2 (недопустимо)
думаю это не универсальный код.
сейчас заюзал вариант Фаната. замечательно работает
 
Сверху