Как задать количество лет на php от определенной даты до текущей даты?
Самый точный, надежный и современный способ вычислить количество лет между двумя датами в PHP — использовать классы DateTime и DateInterval. Этот подход автоматически учитывает високосные годы и разную длину месяцев.
Вот несколько вариантов решения:
1. Объектно-ориентированный стиль (Рекомендуется)
<?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
$targetDate = date_create('1995-05-15');
$currentDate = date_create();
$interval = date_diff($currentDate, $targetDate);
$years = $interval->y;
echo "Прошло полных лет: " . $years;Полезные нюансы и дополнительные примеры
Если дата в нестандартном формате
Если дата приходит, например, в формате дд.мм.гггг, используйте createFromFormat:
$dateString = '15.05.1995';
$targetDate = DateTime::createFromFormat('d.m.Y', $dateString);
$currentDate = new DateTime();
$years = $currentDate->diff($targetDate)->y;Если нужно получить дробное число лет (например, 5.5 лет)
Свойство y возвращает только целые (полные) годы. Если вам нужна математическая точность с учетом месяцев и дней:
$interval = $currentDate->diff($targetDate);
// Считаем годы + месяцы/12 + дни/365
$exactYears = $interval->y + ($interval->m / 12) + ($interval->d / 365.25);
echo round($exactYears, 2); // Округлим до сотыхПроверка на «будущее»
Если указанная дата окажется в будущем, метод diff() всё равно сработает, но у объекта $interval свойство invert будет равно 1. Вы можете это проверить:
if ($interval->invert) {
echo "Дата в будущем!";
} else {
echo "Прошло лет: " . $interval->y;
}⚠️ Чего делать НЕ стоит
Не используйте старую связку strtotime() и деление секунд на количество секунд в году:
// ПЛОХОЙ ПРИМЕР (не делайте так)
$diff = time() - strtotime('1995-05-15');
$years = floor($diff / (365 * 24 * 60 * 60)); Почему это плохо: Этот метод не учитывает високосные годы (366 дней) и может выдавать ошибку на 1 день/год в зависимости от того, как легли високосные года в промежутке. Всегда используйте DateTime::diff().