Сегодня была поставлена задача поменять количество лет, которые исполнились нашей организации в слайдере на главной странице. В частности, в слайдере стояла фраза "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!