【问题标题】:How do I get next occurrence of a certain day of the month如何获得一个月中某一天的下一次出现
【发布时间】:2013-01-16 03:38:23
【问题描述】:

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

我尝试了在这个 SO 问题 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月有问题吗?任何指导将不胜感激。

【问题讨论】:

    标签: php stripe-payments


    【解决方案1】:

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

    如果这不是您所需要的,请说明问题。

    【讨论】:

    • 我不想要 30 天,我想要最近的 15 日或 12 日或客户选择的任何日期。
    • 但是最接近 '2013-01-31' 的 '31st' 是什么!
    【解决方案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 检查日期。

    【讨论】:

    • 啊,谢谢你让我走上正轨!我确实添加了一些代码,以防下个月是 2 月。很好的答案,虽然我因为盯着代码而脑死亡。
    • 没问题,并且很好地调用了编辑...尽管您可能希望在第一个 if 语句中使用相同的逻辑...因为我猜 $userDay 可能是2 月 29 日,今天是 2 月 28 日,系统将假设 3 月 1 日,我认为这不是你想要的。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2010-09-07
    • 1970-01-01
    • 2012-12-12
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多