Месяц и год не работают в PHP - PullRequest
0 голосов
/ 28 августа 2018

Я хочу получить номер месяца и год на следующие 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

Пожалуйста, предложите какое-нибудь решение.

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Я бы предложил использовать класс 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>';
}

0 голосов
/ 28 августа 2018
$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>";
}
0 голосов
/ 28 августа 2018

Когда вы пытаетесь использовать 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";
}

Демо

Некоторые вещи, которые следует иметь в виду:

  1. Убедитесь, что вы переходите в первый день месяца для даты начала, как если бы вы использовали свой код с месяцами, у которых есть 31 день, когда он сломается, и февраль будет проблемой с 29-го числа каждого месяца до конца этого. месяц.
  2. Если текущий день идет после последнего дня другого месяца, вам нужно вернуться к последнему дню этого месяца. Это вступит в действие с месяцами, у которых 31 день и февраль каждый месяц с 29го числа.
...