Получение последнего дня данного месяца с ошибками в месяцы 31 дня - PullRequest
0 голосов
/ 07 сентября 2018

У меня такая проблема. Для данной даты мне нужно получить последний день каждого из предыдущих месяцев до 5 месяцев. Например, если введена дата 2018-08-21, то результат, который я хочу получить, будет примерно таким (2018-07-31,2018-06-30,2018-05-31,2018-04-30,2018- 03-31)

Я написал цикл for для повторения 5 раз и использовал следующий код, чтобы получить предыдущий месяц. Но в месяцы 31 день, это не совсем так, как в предыдущем месяце. Это дает последний день как «2011-07-31», что не соответствует действительности. Есть ли обходной путь для этого ??

$datetocheck = "2011-07-31";
$lastday = date('Y-m-t', strtotime('-1 month', strtotime($datetocheck)));
echo $lastday; //this gives 2011-07-31(Expected value is 2011-06-30)

Ответы [ 5 ]

0 голосов
/ 07 сентября 2018

требование может быть достигнуто с помощью цикла с использованием DateTime.Если я правильно понимаю, попробуйте

$startDate = new DateTime('2018-08-21');

$dateArr = array();

for($i=0; $i<=4; $i++) {
  $date = $startDate;

  $date->modify("last day of previous month");
  $lastDateOfMonth =  $date->format("Y-m-d");

  $dateArr[] = $lastDateOfMonth;
  $startDate = new DateTime($lastDateOfMonth);
}

$dateList = implode(",", $dateArr);

echo $dateList;
0 голосов
/ 07 сентября 2018

Для решения этой проблемы вы можете попробовать это

<?php
$datetocheck = "2011-07-31";
$tmp_date = date('Y-m-01',strtotime($datetocheck));
$lastday = date('Y-m-t', strtotime('-1 month', strtotime($tmp_date)));
echo $lastday; //this value is 2011-06-30
?>
0 голосов
/ 07 сентября 2018

Попробуйте использовать DateTime Класс. Вы можете запустить это в цикле, как показано ниже

function lastDayOfMonth($datetocheck, $noOfMonth){

    $date = new \DateTime($datetocheck);
    $month = ((int) ($date)->format('m'))-$noOfMonth;
    $year = ($date)->format('Y');

    $lastMonth = new \DateTime("{$year}-{$month}");

    $lastday = $lastMonth->format('Y-m-t');

    echo $lastday . PHP_EOL;

}

for($i = 1; $i <= 5; $i++){
    lastDayOfMonth('2011-07-31', $i);
}
0 голосов
/ 07 сентября 2018

Просто и легко понять.Попробуйте это: -

$initialDate = "2011-07-31";
for($i=1; $i<=5; $i++) {
    echo date('Y-m-d', strtotime('last day of -' . $i . ' month', strtotime($initialDate))) . "<br>";
}

Проверьте это Скрипка ссылка

0 голосов
/ 07 сентября 2018

попробуйте с этим

echo date('2011-07-31', strtotime('last day of previous month'));
//2011-06-30

или

<?php
$date = '2011-07-31';
$date = new DateTime($date);
for($i=0;$i<5;$i++){
    $date->modify("last day of previous month");
    echo $date->format("Y-m-d")."<br>";
    $newDate= $date->format("Y-m-d");
    $date=new DateTime($newDate);
}
?>
...