найти дату месяца назад, будет ли он пропустить даты, если текущий месяц короче? - PullRequest
2 голосов
/ 17 июня 2011

Я пишу скрипт для запроса дат "3 месяца назад". Поскольку я думаю о том, чтобы не пропустить ничего, я использую это для сравнения:

$date = date("Y-m-d",mktime(0,0,0,date("m")-$months_ago,date("d")));

Я понимаю, что есть шанс, что я могу пропустить даты. Например, если я буду искать даты 30:30 три месяца назад, я получу 8/30. Но следующий день 12/1, а три месяца назад - 9/1. Так что в этом сценарии я пропустил 31.08.

Полагаю, лучший способ - использовать дни (90 дней) вместо месяцев. Это лучшая практика для чего-то подобного?

Ответы [ 3 ]

9 голосов
/ 17 июня 2011

Перейдите непосредственно к 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');

3 голосов
/ 17 июня 2011
$when = strtotime('-3 months');
0 голосов
/ 04 июня 2013

Если вам нужен только месяц / год и вам не нужно вычислять дни:

$m = 5;  // how many months ago, for example

$now = time();
$cm = date("m",$now); // current month
$yr = date("Y",$now) - intval((12 + $m - $cm)/12);
$month = (($cm + 11 - ($m % 12) ) % 12) + 1;

echo "$m months ago: $month  yr: $yr\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...