Как получить следующее вхождение определенного дня месяца

Я пытаюсь заставить полосу установить дату end_trial в следующее появление любого дня месяца, который выберет пользователь. т. е. если сегодня 16-е число, а пользователь выбирает 15-е, мне нужна временная метка unix на 15-е число следующего месяца. Однако, если сегодня было 14-е, мне нужна отметка времени на завтра.

Я попробовал решение, найденное в этом вопросе SO Найдите дату следующего 15-го числа, используя php .

Когда я запустил код, предложенный в этом вопросе, и заменил 15 на 31

$nextnth = mktime(0, 0, 0, date('n') + (date('j') >= 31), 31);

echo date('Y-m-d', $nextnth);

Результат 2013-03-03

Я также попробовал этот Получить дату следующего появления 18-го .

Второй на самом деле дал бы мне 2013-03-31, когда я запустил его 2013-1-31.

Оба имели неожиданные результаты. Февраль проблема? Любое руководство будет высоко оценено.


person codaniel    schedule 31.01.2013    source источник


Ответы (2)


Вот как это сделать.

function nextDate($userDay){      

  $today = date('d'); // today

  $target = date('Y-m-'.$userDay);  // target day

  if($today <= $userDay){

   $return = strtotime($target);

  }
  else{

   $thisMonth = date('m') + 1;
   $thisYear = date('Y');

   if($userDay >= 28 && $thisMonth == 2){
       $userDay = 28;
   }


   while(!checkdate($thisMonth,$userDay,$thisYear)){

     $thisMonth++;

     if($thisMonth == 13){

       $thisMonth = 1;
       $thisYear++;

     }

   }      

   $return = strtotime($thisYear.'-'.$thisMonth.'-'.$userDay);

  }

  return $return; 

}

// usage
echo date('Y-m-d',nextDate(29));

Мы получаем выбор пользователя и сравниваем его сегодня.

  • Если сегодняшний день меньше или равен выбору пользователя, мы возвращаем метку времени для этого месяца.

  • Если сегодня больше, чем выбор пользователя, мы перебираем даты, добавляя месяц (или год, если $thisMonth достигает 13). Как только эта дата снова появится, у нас будет ответ.

Мы проверяем даты с помощью функции php checkdate, strtotime и дата.

person Dylan    schedule 01.02.2013
comment
О, спасибо, вы поставили меня на правильный путь! Я добавил код на случай, если следующий месяц будет февраль. Хороший ответ, хотя мой мозг был мертв из-за того, что я смотрел на код. - person codaniel; 01.02.2013
comment
Нет проблем, и хороший призыв к редактированию... хотя вы можете использовать ту же логику в первом операторе if... поскольку я предполагаю, что $userDay может быть 29 февраля, а сегодня - февраль. 28-го, а система примет 1-е марта, и я не думаю, что вы этого хотите. :) - person Dylan; 01.02.2013

Я действительно не понимаю вопроса полностью. Например, вы можете легко определить дату на следующие 30 дней.

$next_ts = time() + 30 * 86400; // add 30 days to current timestamp
$next = date('Y-m-d', $next_ts);   // format string as Y-m-d 
echo $next;

Если это не то, что вам нужно, пожалуйста, объясните проблему.

person mileusna    schedule 31.01.2013
comment
Мне не нужны 30 дней, я хочу ближайший 15-й или 12-й или любой другой день, который выберет клиент. - person codaniel; 01.02.2013
comment
Но что такое ближайшее «31-е» к «31 января 2013 года»! - person Strawberry; 01.02.2013