Перейдите непосредственно к strtotime('-3 month');
, вы также можете указать отрицательные значения, например -3, в параметре mktime месяца, и он будет работать как шарм (лучше второе решение). Нет, это не будет пропускать дни - если «сейчас» будет 2011-06-17, он вернет отметку времени, эквивалентную 2011-03-17.
Edit:
Ну, на самом деле это может быть правдой, что вы можете пропустить дни (я не проверил ваше утверждение), но в конце концов ваша единица измерения времени - месяцы, а не дни. Я говорю о том, что в григорианском календарном месяце не постоянное количество времени - это могут быть 28, 29, 30 или 31 день.
Допустим, вы хотите рассчитать месяцы для платного периода подписки. Если пользователь платит один месяц 2011-02-15, когда истечет срок его подписки? Я бы предположил 2011-03-15, хотя между этими двумя датами всего 28 дней. И если он заплатит за подписку на 2011-03-15, он получит полные 31 день до 2011-04-15, и это кажется совершенно справедливым для меня, поскольку подписка «один месяц», это просто разное количество дней в году.
Если в вашем случае вы не хотите получать «3 месяца назад», но хотите получить постоянное количество времени, которое относительно представляет «3 месяца», то вы можете использовать среднюю продолжительность месяца - 88,59 дня или 88 дней 14 часов и 10 минут. Это представляется с кодом будет:
strtotime('-88 days -14 hours -10 minutes');