不在PHP中工作的月份和年份

不在PHP中工作的月份和年份,php,datetime,datetime-format,Php,Datetime,Datetime Format,我想得到接下来18个月的月数和年份。 我尝试了以下代码: $dat=strtotime(date('Y-m-d')); $mnth = date('n'); $yr=date('Y'); echo $mnth." | " . $yr . " | " . date("Y-m-d", $dat); echo "<hr>"; for($i=0; $i<=18;$i++) { echo date("n", strtotime("+1 month", $d

我想得到接下来18个月的月数和年份。 我尝试了以下代码:

$dat=strtotime(date('Y-m-d'));
  $mnth = date('n');
  $yr=date('Y');
  echo $mnth." | " . $yr . " | " . date("Y-m-d", $dat);
  echo "<hr>";
  for($i=0; $i<=18;$i++)
  {
    echo date("n", strtotime("+1 month", $dat)) ." | ".date("Y", strtotime("+1 month", $dat)) . " | " . date("Y-m-d", strtotime("+1 month", $dat)) ."<br><hr>";
    $dat=date("Y-m-d", strtotime("+1 month", $dat));
  }
但所有后续迭代都会产生以下错误:

注意:在中遇到格式不正确的数值 第11行的D:\Programs\PHP\aa\tdate.PHP

注意:在中遇到格式不正确的数值 第11行的D:\Programs\PHP\aa\tdate.PHP

注意:在中遇到格式不正确的数值 D:\Programs\PHP\aa\tdate.PHP,第11行2 | 1970| 1970-02-01


请提出一些解决方案。

当您尝试使用
date()
strotime()
来操纵日期时,您使用的日期并非真正为之设计的

与和一起使用可以让您快速、轻松、清晰地遍历日期

要记住的一些事情:

  • 确保你的开始日期是一个月的第一天,就好像你使用代码的月份有31天,它会中断,从每个月的29日到该月的结束,二月将是一个问题
  • 如果当前日期在另一个月的最后一天之后,则需要返回到该月的最后一天。这将在有31天的月份和从29日开始的每月2月开始生效

  • 当您试图使用
    date()
    strotime()
    来操纵日期时,您使用的是它们并非真正为您设计的方式

    与和一起使用可以让您快速、轻松、清晰地遍历日期

    要记住的一些事情:

  • 确保你的开始日期是一个月的第一天,就好像你使用代码的月份有31天,它会中断,从每个月的29日到该月的结束,二月将是一个问题
  • 如果当前日期在另一个月的最后一天之后,则需要返回到该月的最后一天。这将在有31天的月份和从29日开始的每月2月开始生效

  • 我建议使用该类来完成此任务,这将更容易:

    // The actual month
    $date = new DateTime(date('Y-m-') . '1');
    
    // For the next 18 months
    for ($i=0; $i < 18; $i++) {
    
        // Add a month to the date
        $date->add(new DateInterval('P1M'));
    
        // Output it as you wish:
        echo $date->format('n | Y | Y-m-d') . '<br>';
    }
    
    //实际月份
    $date=新的日期时间(日期('Y-m-')。'1');
    //在接下来的18个月里
    对于($i=0;$i<18;$i++){
    //在日期上加上一个月
    $date->add(新的日期间隔('P1M'));
    //按您的意愿输出它:
    echo$date->format('n | Y | Y-m-d')。
    ; }


    我建议使用该类来完成此任务,这将更容易:

    // The actual month
    $date = new DateTime(date('Y-m-') . '1');
    
    // For the next 18 months
    for ($i=0; $i < 18; $i++) {
    
        // Add a month to the date
        $date->add(new DateInterval('P1M'));
    
        // Output it as you wish:
        echo $date->format('n | Y | Y-m-d') . '<br>';
    }
    
    //实际月份
    $date=新的日期时间(日期('Y-m-')。'1');
    //在接下来的18个月里
    对于($i=0;$i<18;$i++){
    //在日期上加上一个月
    $date->add(新的日期间隔('P1M'));
    //按您的意愿输出它:
    echo$date->format('n | Y | Y-m-d')。
    ; }

    $dat=strotime(日期('Y-m-d'));
    对于($i=0;$i
    $dat=strotime(日期('Y-m-d'));
    
    对于($i=0;$i这是一种痛苦的方式来完成这项任务。这是一种痛苦的方式来完成这项任务。仅供参考,此代码将在月底31天内中断,从每月29日到月底,二月将是一个问题。@johncode你是对的。用另一种方式修复了它。刚刚意识到这个答案,我的,没有给出当前的mo日期n就像OP在寻找forThnx一样,这是一个简单的解决方案。或多或少,@Neetu。请阅读上面的评论。只要您不需要使用输出显示的当前日期,那么是的,这是一个简单的解决方案。仅供参考,此代码将在月底31天内中断,2月29日到月底将是一个问题每个月。@johncode你是对的。用另一种方法修复了它。你刚刚意识到这个答案,我的答案,并没有像OP在寻找forThnx那样返回月的当前日期,这是一个简单的解决方案。或多或少,@Neetu。阅读上面的评论。只要你不需要使用输出显示的当前日期,那么是的,atraightforward解决方案。代码转储并不能提供好的答案。您应该解释这是如何解决问题的,以及为什么解决问题。我建议您阅读,"由于这段代码只是OP的简化版本,我认为没有必要进行冗长的解释。但你应该解释为什么以及如何解决他们的问题。仅仅给他们工作代码并不能帮助他们或任何其他人理解他们为什么会有问题。代码转储并不能得到很好的答案。你应该解释这是如何解决的以及为什么解决的这是他们的问题。我建议阅读:“因为这段代码只是OP的简化版本,所以我认为没有必要进行冗长的解释。但你应该解释为什么以及如何解决他们的问题。仅仅给他们工作代码并不能帮助他们或任何其他人理解他们为什么会有问题。
    // The actual month
    $date = new DateTime(date('Y-m-') . '1');
    
    // For the next 18 months
    for ($i=0; $i < 18; $i++) {
    
        // Add a month to the date
        $date->add(new DateInterval('P1M'));
    
        // Output it as you wish:
        echo $date->format('n | Y | Y-m-d') . '<br>';
    }
    
    $dat=strtotime(date('Y-m-d'));
    for($i=0; $i<=18;$i++)
    {
        echo date("n", strtotime("+".$i." month", $dat)) ." | ".date("Y", strtotime("+".$i." month", $dat)) . " | " . date("Y-m-d", strtotime("+".$i." month", $dat)) ."<br><hr>";
    }