Сегодня была поставлена задача поменять количество лет, которые исполнились нашей организации в слайдере на главной странице. В частности, в слайдере стояла фраза "22 года на рынке экспертных услуг". Следовательно, нужно было сделать 23. Как и любой уважающий себя программист, я очень люблю автоматизировать все рутинные процессы. А особенно те, которые можно забыть. Ведь не так просто помнить каждый год, что в определённую дату нужно поменять одну цифру в нескольких местах кода.
И я написал скрипт, который определяет текущую дату, считает, сколько лет организации, и выводит всё с учётом падежей русского языка.
Скрипт тестировал на любых датах, которые выводят от 1 года и до 110 лет.
В частности, строка текста сейчас выглядит так:
<?=getFullExperience()?> на рынке экспертных услуг
И выводит в нашем случае, на текущий момент времени: "23 года на рынке экспертных услуг".
Когда компании будет 25 лет, будет выведено: "25 лет..." и так далее.
Итак, как автоматизировать подсчёт лет для организации (или человека)
Первым делом обратим внимание на особенности падежей русского языка по отношению к годам. В частности, если число не находится в интервале от 11 до 14, то любое число, оканчивающее на '0', '5', '6', '7', '8', '9' будет читаться как 'лет'. Т.е., 'тридцать лет, сорок пять лет' и т.д. Любое число, оканчивающее на '1' (опять же, если число не в интервале от 11 до 14), будет читаться как 'год'. Например: 'один год, двадцать один год' и т.д. И любое число (кроме обозначенного выше интервала), оканчивающее на '2', '3', '4', будет читаться как 'года'. Например, '32 года, 2 года' и т.д. Особенности возникают только с числами '11', '12', '13', '14', поскольку они не попадают ни под одно правило выше. И всегда читаются вместе со словом 'лет'.
Ниже привожу скрипт, с комментариями.
<?
function getFullExperience() {
// вводим дату основания компании. Я для примера ввёл дату своего рождения
// чтобы избежать ошибок при вводе цифр с ведущим нулём, например, '05',
// мы принимаем числа в качестве строк и преобразовываем их в число с помощью intval()
$dayBirth = intval('29');
$monthBirth = intval('05');
$yearBirth = intval('1983');
// определяем текущий год, месяц, день
$dayNow = date('d'); $monthNow = date('m'); $yearNow = date('Y');
// если текущий месяц больше месяца основания компании
// или если текущий месяц равен месяцу основания и при этом текущий день больше или равен дню основания
if($monthNow > $monthBirth || ($monthNow == $monthBirth && $dayNow >= $dayBirth)) {
$fullExperience = $yearNow - $yearBirth; // количество лет равно текущему году минус год основания
}
else { // в противном случае, количество лет меньше на 1
$fullExperience = $yearNow - $yearBirth - 1;
}
// далее формируем текст 'года', 'лет' или 'год'
// если число лет находится в интервале от 11 до 14, то всегда будем прибавлять слово 'лет'
if($fullExperience >= 11 && $fullExperience <= 14) {
$dayText = 'лет';
}
else { // для всех остальных чисел
// записываем в переменную $dayText последнее число в наборе цифр
// т.е., если число состоит из двух цифр - записываем последнюю
// если число из одной цифры - то она и так будет последней
// Для этого сначала преобразуем число опыта в строку функцией strval()
// затем берём последний символ строки, например: $fullExperience[1]
$dayText = strval($fullExperience)[strlen($fullExperience)-1];
if($dayText == 2 || $dayText == 3 || $dayText == 4) {
$dayText = 'года';
}
elseif($dayText == 1) {
$dayText = 'год';
}
else {
$dayText = 'лет';
}
}
return $fullExperience.' '.$dayText;
}
?>
Пример вызова функции в html коде:
<p>Наша компания работает уже <?=getFullExperience()?> на рынке экспертных услуг</p>
Будет выведено, например: 'Наша компания работает уже 23 года на рынке экспертных услуг'
Кстати, для любителей объектно-ориентированного стиля ещё есть такой вариант расчёта даты:
<?
$now = new DateTime();
$company_birth = new DateTime('29-05-1983');
$diff = date_diff($now, $company_birth);
echo $diff->format('%y');
?>
Буду рад, если Вашему сайту пригодится данный скрипт!
Подписывайтесь на группу в ВКонтакте, вступайте в сообщество на Facebook, чтобы всегда быть в курсе актуальных выпусков
Web development blog!