如何在下个月的某一天进行下一次出现

时间:2013-01-31 21:57:38

标签: php stripe-payments

我正试图获取条带以在用户选择的月份的任何一天的下一次出现时设置end_trial日期。即如果今天是第16个并且用户选择第15个,我需要下个月15日的unix时间戳。但是,如果今天是第14届我需要明天的时间戳。

我尝试了在这个问题Find the date for next 15th using php上找到的解决方案。

当我运行该问题中建议的代码并替换15代表31

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

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

结果是2013-03-03

我也试过这个Get the date of the next occurrence of the 18th

当我在2013-1-31运行时,第二个实际上会给我2013-03-31。

两者都有意想不到的结果。二月是问题吗?任何指导都将非常感谢。

2 个答案:

答案 0 :(得分: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's checkdate functionstrtotimedate检查日期。

答案 1 :(得分:0)

我真的完全不理解这个问题。您可以轻松确定下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;

如果这不是您所需要的,请解释问题。