月和年不适用于PHP

时间:2018-08-28 11:36:44

标签: 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", $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

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

  

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

     

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

     

注意:遇到一个格式不正确的数值   第11行上的D:\ Programs \ PHP \ aa \ tdate.php 2 | 1970年|   1970-02-01

请提出一些解决方案。

3 个答案:

答案 0 :(得分:3)

当您尝试使用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月的月份开始发挥作用。

答案 1 :(得分: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>';
}

答案 2 :(得分:0)

$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>";
}