PHP: как правильно посчитать разницу между двумя указанными датами?

программирование php базы данных

Пробую сделать через mktime и bcdiv. Но... Почему-то даты немного смещаются: если сегодня 16-е декабря 2010, а первую дату указать 16 декабря 2000 года, то вывод будет неверным, пока не укажешь во второй дате 18 декабря 2000 и выше. То есть для возраста 10 лет "день рождения" смещается на 2 дня. Для возраста 20 лет - на 4 дня. Либо это високосный год учитывать нужно, либо я что-то не так делаю.
Вот код:


<?php
$teen = mysql_query( "SELECT * FROM users WHERE user_status = 'verified' LIMIT 5" );

while($array_teen=mysql_fetch_array($teen)){
$user_birth = $array_teen['user_birth'];
$birth = explode('-', $user_birth);
$datenow = explode('-', date("Y-m-d"));

$birthdate = mktime(0, 0, 0, $birth[1], $birth[2], $birth[0]);
$ourtime = mktime(0, 0, 0, $datenow[1], $datenow[2], $datenow[0]);

$teenage = $ourtime - $birthdate;

$ages = 0;
$age_m = bcdiv($teenage, 2628000);
$age_y = bcdiv($age_m, 12);
$ages = $ages + $age_y;

if( $ages == 1 )
{ $ages = "$ages год"; }
if( $ages == 2 )
{ $ages = "$ages года"; }
if( $ages == 3 )
{ $ages = "$ages года"; }
if( $ages == 4 )
{ $ages = "$ages года"; }
if( $ages > 4 )
{ $ages = "$ages лет"; }

echo "<li class='teen'>" . $array_teen['user_login'] . " ($ages)</li>";
}
?>

Примечание:
Epsiloncool, спасибо) Мне нужно было узнать количество полных лет, плюс выводить это число рядом с именем пользователя. Но, согласитесь, было бы не совсем корректно оставлять функцию так, как написал я, у человека бы день рождения "запаздывал") Днем попробую Ваш вариант.
su_MpaK, и Вам спасибо, по ссылке прошелся, тоже почитаю полностью днем, сейчас в институт убегаю.

Примечание:
Epsiloncool, кстати, да, можно попробовать и так реализовать) просто у меня на том же сайте в другой функции подсчитывается кол-во лет и месяцев, вот и взял оттуда.

Примечание:
Epsiloncool, спасибо за помощь! ;)
Попробовал через bcdiv делить на 2629800 (то есть с учетом 365.25), тогда работает уже правильно, но не учитывает текущий день (то есть у человеку сегодня исполняется 10 лет, но до завтрашнего дня будет писать, что ему еще 9). Поэтому реализовал так:

$teen = mysql_query( "SELECT * FROM users WHERE user_status = 'verified' LIMIT 5" );

while($array_teen=mysql_fetch_array($teen)){
$user_birth = $array_teen['user_birth'];

if (date('md') >= date('md',strtotime($user_birth)) ) {
$t = 1;
} else {
$t = 0;
}

$ages = date('Y') - date('Y',strtotime($user_birth)) - 1 + $t;
Ответы:
для расчетов надо учитывать что в году 365.25 дней (отсюда и берется високосный год) - попробуйте, скорее всего заработает.
Вы всё делаете абсолютно правильно и выводы ваши логичны. Поскольку от 16 декабря 2000 года до 16 декабря 2010 года на самом деле проходит не 365*10 дней, а 365*10+2 дня, т.к. в одном году приблизительно 365,25... дней.
Что вы хотите получить ? Количество дней ? Да, оно действительно 365*10+2. Количество месяцев ? (365*10+2)/30,4375 Количество лет ? (365*10+2)/365,25.
Под конкретно вашу задачу проще было бы сделать так


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.