Как получить год + 1, если дата уже пройдена - PullRequest
0 голосов
/ 17 июня 2019
$mpsAgeT = $today->diff($mpsAgeT);

Где $today:

object(DateTime)[37]
  public 'date' => string '2019-06-17 13:40:56.888563' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Europe/Sofia' (length=12)

и $mpsAgeT:

object(DateTime)[38]
  public 'date' => string '2016-06-15 13:40:56.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Europe/Sofia' (length=12)

Возвращает мне 3 года , но 15.06 -более старая дата, поэтому я хочу вернуть 4 года, 3 прошло и 4 года началось.

Если я только добавил 1 год, он не будет работать, если дата не пройдена или не равна.

Например:

17.06.2019 and 17.06.2016 - should returns me 3
17.06.2019 and 19.06.2016 - should returns me 3
17.06.2019 and 15.06.2016 - should returns me 4

Ответы [ 2 ]

3 голосов
/ 17 июня 2019

Как я предлагал в комментариях, вы всегда должны добавлять один, если даты не совпадают точно, чтобы получить ожидаемый результат:

$diff = $today->diff($mpsAgeT);
$years = $diff->y;

 if (addOne($diff)) {
   $years++;
 }

function addOne($interval) {
    // Iterate precision properties of Interval object
    // In this case, month and days, but can add hours, minutes (check edits)
    // If it's anything other than exact years, should add one
    $props = ['m', 'd'];
    foreach ($props as $prop) {
        // This returns as soon as a property is not 0
        if ($interval->{$prop} !== 0)
          return true;
    }
    return false;
}

Демо

Альтернативное решение без использования интервалов:

// Find year difference
$years = $today->format('Y') - $mpsAgeT->format('Y');
// Add to original date (sets it to the same date of the current year)
// Only add if the date has passed
if ($today > $mpsAgeT->modify('+' . $years . ' years')) {
   $years++;
}

Демо

1 голос
/ 17 июня 2019

Вы можете просто проверить, все ли переменные не равны 0

$today = new DateTime('2019-06-17 13:40:56.888563');
$mpsAgeT = new DateTime('2016-06-17 13:40:56.888563');
    $interval = $today->diff($mpsAgeT);
    $diff = $interval->format('%y');
    if (!($interval->d === 0 && $interval->m === 0 && $interval->h === 0 && $interval->i === 0 && $interval->s === 0)) {
        $diff++;
    }
    echo $diff; // returns 3

$today = new DateTime('2019-06-17 13:40:56.888563');
$mpsAgeT = new DateTime('2016-06-19 13:40:56.888563');
$interval = $today->diff($mpsAgeT);
$diff = $interval->format('%y');
if (!($interval->d === 0 && $interval->m === 0 && $interval->h === 0 && $interval->i === 0 && $interval->s === 0)) {
    $diff++;
}
echo $diff;// returns 3

$today = new DateTime('2019-06-17 13:40:56.888563');
$mpsAgeT = new DateTime('2016-06-15 13:40:56.888563');
$interval = $today->diff($mpsAgeT);
$diff = $interval->format('%y');
if (!($interval->d === 0 && $interval->m === 0 && $interval->h === 0 && $interval->i === 0 && $interval->s === 0)) {
    $diff++;
}
echo $diff;// returns 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...