Как вычесть год из високосного года - PullRequest
1 голос
/ 21 февраля 2020

Я ищу решение для следующего:

$date = new DateTime('02/29/2020');
$date->sub(new DataInterval('P1Y'));
$date->format('m/d/Y');

Это Возвращает: 03/01/2019

Есть ли способ вернуть 28/02/2019? Спасибо

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

date('L') возвращает true, если високосный год, поэтому:

<?php

$date = new DateTime('02/29/2020');
$date->format('L') && $date->format('m-d') == '02-29' ? 'P366D' : 'P1Y';
$date->sub(new DateInterval($interval));
echo $date->format('m/d/Y');

Проверьте это здесь https://3v4l.org/4mXX4

0 голосов
/ 21 февраля 2020

Задача общая: добавьте или вычтите месяц к дате, не переходя к следующему месяцу, если дата близка к концу месяца. Для года это прибавить или вычесть 12 месяцев.

Алгоритм функции addMonthCut () был взят здесь .

function addMonthCut(DateTime $date,$month = 1) {
  $dateAdd = clone $date;
  $dateLast = clone $date;
  $strAdd = ' '.(int)$month.' Month';
  $strLast = 'last Day of '.(int)$month.' Month';
  if ($dateAdd->modify($strAdd) < $dateLast->modify($strLast)) {
    $date->modify($strAdd);
  }
  else {
    $date->modify($strLast);
  }
  return $date;
}

Примеры:

$date = new DateTime('02/29/2020');
$date = addMonthCut($date,-12);  //-1 Year
echo $date->format('m/d/Y');  //02/28/2019

$date = new DateTime('02/28/2019');
$date = addMonthCut($date,+12);  //+1 Year
echo $date->format('m/d/Y');  //02/28/2020

$date = new DateTime('01/31/2020');
$date = addMonthCut($date,+1);  //+1 Month
echo $date->format('m/d/Y');  //02/29/2020
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...