Возраст | PHP и JavaScript

Фраза «мы работаем с 1880 года» звучит менее впечатляюще, чем «мы работаем более ». Можно, конечно, из года в год 1 января менять цифру «», а можно написать короткий скрипт, который сам рассчитает правильное количество лет.

Правильное склонение по-русски: «год», «года», «лет» в JavaScript

18 лет
<script>
function declOfNum(number, titles) { // склонение именительных рядом с числительным
  cases = [2, 0, 1, 1, 1, 2];  
  return number+" "+titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];  
}
document.write( declOfNum(18, ['год', 'года', 'лет']) );
</script>

Сравнение дат в формате «год месяц день»

16 лет 4 месяца 14 дней
<script>
function declOfNum(number, titles) {
  cases = [2, 0, 1, 1, 1, 2];  
  return number+" "+titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];  
}
function birthDateToAge(b, n) {
  var x = new Date(n), z = new Date(b), b = new Date(b), n = new Date(n);
  x.setFullYear(n.getFullYear() - b.getFullYear(), n.getMonth() - b.getMonth(), n.getDate() - b.getDate());
  z.setFullYear(b.getFullYear() + x.getFullYear(), b.getMonth() + x.getMonth() + 1);
  if (z.getTime() == n.getTime()) {
    if (x.getMonth() == 11) {
      return [x.getFullYear() + 1, 0, 0];
    } else {
      return [x.getFullYear(), x.getMonth() + 1, 0];
    }
  } else {
    return [x.getFullYear(), x.getMonth(), x.getDate()];
  }
}
var birth = birthDateToAge("2000-03-01", "2016-07-15");
document.write( declOfNum(birth[0], ['год', 'года', 'лет']) + " " + declOfNum(birth[1], ['месяц', 'месяца', 'месяцев']) + " " + declOfNum(birth[2], ['день', 'дня', 'дней']) );   // birth[0] — разница между датами в годах
</script>

Вычисление возраста по дате рождения

<script>
function declOfNum(number, titles) {
  cases = [2, 0, 1, 1, 1, 2];  
  return number+" "+titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];  
}
function birthDateToAge(b) {
 var n = new Date(), b = new Date(b),
     age = n.getFullYear() - b.getFullYear();
 return n.setFullYear(1972) < b.setFullYear(1972) ? age - 1 : age;
}
document.write( declOfNum(birthDateToAge("1880-07-15"), ['год', 'года', 'лет']) );
</script>

Пример: калькулятор возраста по дате рождения

Подсчёт разницы лет

<script>
function declOfNum(number, titles) {
  cases = [2, 0, 1, 1, 1, 2];  
  return number+" "+titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];  
}
document.write( declOfNum(new Date().getFullYear() - 1880, ['год', 'года', 'лет']) );
</script>

Определить количество дней между двумя датами

5980 дней
<script>
function declOfNum(number, titles) {
  cases = [2, 0, 1, 1, 1, 2];  
  return number+" "+titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];  
}
function birthD(b, n) {
  var b = new Date(b), n = new Date(n);
  return (n - b)/86400000;
}
document.write( declOfNum(birthD("2000-03-01", "2016-07-15"), ['день', 'дня', 'дней']) );
</script>

Как посчитать разницу между датами в годах на PHP

<?php
echo date('Y')-1880;
?>

«Год», «года», «лет» в зависимости от числа

<?php
function YearTextArg($year) {
    $m = substr($year,-1,1);
    $l = substr($year,-2,2);
    return $year. ' ' .((($m==1)&&($l!=11))?'год':((($m==2)&&($l!=12)||($m==3)&&($l!=13)||($m==4)&&($l!=14))?'года':'лет'));
}
echo YearTextArg(date('Y')-1880);
?>

Рассчитать возраст на PHP

<?php 
$age = DateTime::createFromFormat('d/m/Y', '29/02/1880')
     ->diff(new DateTime('now'))
     ->y;
echo $age;
 ?>

Возраст со словом «год», «года» или «лет»

<?php
$age = DateTime::createFromFormat('d/m/Y', '29/02/1880')
     ->diff(new DateTime('now'))
     ->y;
function YearTextArg($year) {
    $m = substr($year,-1,1);
    $l = substr($year,-2,2);
    return $year. ' ' .((($m==1)&&($l!=11))?'год':((($m==2)&&($l!=12)||($m==3)&&($l!=13)||($m==4)&&($l!=14))?'года':'лет'));
}
echo YearTextArg($age);
?>
Использованные материалы:
  1. Возраст JavaScript,
  2. Возраст PHP
в f t
наверх ↑

11 комментариев:

Анонимный
Спасибо, отличные скрипты))
NMitra
Благодарю за отзыв!
Александр Шаповал
Вопрос по "Возраст со словом «год», «года» или «лет»" - последний пример: я, использую этот пример для вычисления возраст юзера в CMS Joomla. Как в строку "RETURN", вместо русских: 'год', 'года' и 'лет', вставить языковую переменную Joomla...? Языковая переменная, выглядит вот так:

Заранее благодарю за ответ
Александр Шаповал
Не пропустило языковую переменную. Дублирую снова: языковая переменная, выглядит вот так: echo JText::_( 'COM_CCK_LANG_VAR' );
NMitra
А зачем? Тогда нужно три переменных.
Для того, чтобы написать код в комментариях, пожалуйста используйте http://shpargalkablog.ru/2010/12/napisat-kod-tekstom.html
Александр Шаповал
Ок. Понял.

Так как все же ПРАВИЛЬНО вставить эту переменную вместо 'год' - эту: <?php echo JText::_( 'COM_CCK_LANG_VAR1' ); ?>, вместо 'года' - эту: <?php echo JText::_( 'COM_CCK_LANG_VAR2' ); ?> и вместо 'лет' - эту: <?php echo JText::_( 'COM_CCK_LANG_VAR3' ); ?> ?
NMitra
Не, вместо 'год' пишите сразу JText::_( 'COM_CCK_LANG_VAR1' )
Я сама php знаю поскольку постольку, просто он похож на JS
Александр Шаповал
NMitra, спасибо! Заработало!

Для тех, кто будет повторять этот пример в Joomla, строка RETURN, должна выглядеть так:
return $year. ' ' .((($m==1)&&($l!=11))?JText::_( 'COM_CCK_LANG_VAR1' ):((($m==2)&&($l!=12)||($m==3)&&($l!=13)||($m==4)&&($l!=14))?JText::_( 'COM_CCK_LANG_VAR2' ):JText::_( 'COM_CCK_LANG_VAR3' )));

Ну и соответственно, нужно задать значения языковым переменным в lang-LANG.overide.ini
Vegan Boom
Спасибо! В очередной раз нашла в этом блоге нужную информацию.

А подскажите, пожалуйста ещё и это. Как изменить этот код в JavaScript, если хочу, чтобы отражалось следующее:

Возраст автора на момент написания статьи: ... лет, ... месяцев.
Vegan Boom
Дополнение к предыдущему моему комментарию.

Важно, чтобы я могла это вставить в шаблон сообщений. И у каждого конкретного поста ничего бы не нужно было исправлять. Один универсальный код для всех постов.
NMitra
Дополнила статью примером