【问题标题】:Month and Year not working in PHP月份和年份在 PHP 中不起作用
【发布时间】:2018-08-28 11:36:44
【问题描述】:

我想获取接下来 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));
  }

迭代前的代码和第一次迭代的代码如下:

8 | 2018 | 2018-08-28  
9 | 2018 | 2018-09-28

但所有后续迭代都给出以下错误:

注意:在 D:\Programs\PHP\aa\tdate.php 第 11 行

注意:在 D:\Programs\PHP\aa\tdate.php 第 11 行

注意:在 D:\Programs\PHP\aa\tdate.php 第 11 行 2 | 1970 | 1970-02-01

请提出一些解决方案。

【问题讨论】:

  • 这是一种痛苦的方式来实现这一点

标签: php datetime datetime-format


【解决方案1】:

当您尝试使用date()strtotime() 来操作日期时,您使用它们的方式并不是它们真正设计的用途。

DateTime()DateInterval()DatePeriod() 一起使用可以让您快速、轻松地清晰地地遍历日期。

$start     = new \DateTime('first day of this month');
$end       = (new \DateTime('first day of this month'))->modify('+18 months'); 
$interval  = new \DateInterval('P1M');
$period    = new \DatePeriod($start, $interval, $end);
foreach ($period as $month) {
    $lastDayOfMonth = $month->format('t');
    $day = (date('d') > $lastDayOfMonth) ? $lastDayOfMonth : date('d');
    echo $month->format("n | Y | Y-m-{$day}");
    echo "\n";
}

Demo

注意事项:

  1. 确保您在每月的第一天开始日期,就好像您使用的代码有 31 天的月份会中断,而从每月 29 日到月底,2 月将是一个问题月。
  2. 如果当前日期在另一个月的最后一天之后,您需要返回到该月的最后一天。从 29 日起,每个月有 31 天和 2 月,这将发挥作用。

【讨论】:

    【解决方案2】:

    我建议使用DateTime 类来完成此操作,这样会容易得多:

    // 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>';
    }
    

    【讨论】:

    • 仅供参考,此代码将在 31 天的月底中断,2 月将在每个月的 29 日至月底出现问题。
    • @JohnConde 你是对的。用另一种方式修复它。
    • 刚刚意识到这个答案,我的,并没有像 OP 正在寻找的那样返回当前日期
    • Thnx,这是一个简单的解决方案。
    • 或多或少,@Neetu。阅读上面的 cmets。只要您不需要使用当前的 date 作为输出显示,那么是的,一个简单的解决方案。
    【解决方案3】:
    $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>";
    }
    

    【讨论】:

    • 代码转储不能提供好的答案。你应该解释如何为什么这可以解决他们的问题。我推荐阅读,“How do I write a good answer?"
    • 由于此代码只是 OP 的简化版本,我认为没有必要进行冗长的解释。
    • 但是你应该解释为什么如何这解决了他们的问题。仅仅给他们工作代码并不能帮助他们或其他任何人理解他们为什么会遇到问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多