2

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

我尝试了在这个 SO question 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

我也试过这个获取下一次出现的 18th 的日期

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

两者都有意想不到的结果。2月有问题吗?任何指导将不胜感激。

4

2 回答 2

3

这是一种方法。

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 函数strtotimedate检查日期。

于 2013-02-01T01:17:54.120 回答
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;

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

于 2013-01-31T23:01:44.983 回答