Как задать количество лет на php от определенной даты до текущей даты?

Самый точный, надежный и современный способ вычислить количество лет между двумя датами в PHP — использовать классы DateTime и DateInterval. Этот подход автоматически учитывает високосные годы и разную длину месяцев.

Вот несколько вариантов решения:

1. Объектно-ориентированный стиль (Рекомендуется)

PHP
<?php
// Исходная дата (может быть в любом формате, который понимает strtotime, например Y-m-d)
$targetDate = new DateTime('1995-05-15'); 

// Текущая дата и время
$currentDate = new DateTime(); 

// Вычисляем разницу
$interval = $currentDate->diff($targetDate);

// Свойство 'y' содержит количество полных лет
$years = $interval->y;

echo "Прошло полных лет: " . $years;

2. Процедурный стиль

Если вы предпочитаете процедурный подход, можно использовать функции-алиасы:

PHP
<?php
$targetDate = date_create('1995-05-15');
$currentDate = date_create();

$interval = date_diff($currentDate, $targetDate);

$years = $interval->y;

echo "Прошло полных лет: " . $years;

Полезные нюансы и дополнительные примеры

Если дата в нестандартном формате

Если дата приходит, например, в формате дд.мм.гггг, используйте createFromFormat:

PHP
$dateString = '15.05.1995';
$targetDate = DateTime::createFromFormat('d.m.Y', $dateString);
$currentDate = new DateTime();

$years = $currentDate->diff($targetDate)->y;

Если нужно получить дробное число лет (например, 5.5 лет)

Свойство y возвращает только целые (полные) годы. Если вам нужна математическая точность с учетом месяцев и дней:

PHP
$interval = $currentDate->diff($targetDate);

// Считаем годы + месяцы/12 + дни/365
$exactYears = $interval->y + ($interval->m / 12) + ($interval->d / 365.25);

echo round($exactYears, 2); // Округлим до сотых

Проверка на «будущее»

Если указанная дата окажется в будущем, метод diff() всё равно сработает, но у объекта $interval свойство invert будет равно 1. Вы можете это проверить:

PHP
if ($interval->invert) {
    echo "Дата в будущем!";
} else {
    echo "Прошло лет: " . $interval->y;
}

⚠️ Чего делать НЕ стоит

Не используйте старую связку strtotime() и деление секунд на количество секунд в году:

PHP
// ПЛОХОЙ ПРИМЕР (не делайте так)
$diff = time() - strtotime('1995-05-15');
$years = floor($diff / (365 * 24 * 60 * 60)); 

Почему это плохо: Этот метод не учитывает високосные годы (366 дней) и может выдавать ошибку на 1 день/год в зависимости от того, как легли високосные года в промежутке. Всегда используйте DateTime::diff().