|
Вопрос # 6 493/ вопрос решён / |
|
Доброго времени суток, уважаемые эксперты!
Помогите, пожалуйста довести до ума функцию
/**
* Человекопонятная русская дата (и время)
*
* @param string $date_input Что-то хоть как-то похожее на дату
* @param bool $time Показывать время
* @return string
*/
function date_smart($date_input, $time=false) {
$monthes = array(
'', 'января', 'февраля', 'марта', 'апреля', 'мая', 'июня',
'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'
);
$date = strtotime($date_input);
//Время
if($time) $time = ' G:i';
else $time = '';
//Сегодня, вчера, завтра
if(date('Y') == date('Y',$date)) {
if(date('z') == date('z', $date)) {
$result_date = date('Сегодня'.$time, $date);
} elseif(date('z') == date('z',mktime(0,0,0,date('n',$date),date('j',$date)+1,date('Y',$date)))) {
$result_date = date('Вчера'.$time, $date);
} elseif(date('z') == date('z',mktime(0,0,0,date('n',$date),date('j',$date)-1,date('Y',$date)))) {
$result_date = date('Завтра'.$time, $date);
}
if(isset($result_date)) return $result_date;
}
//Месяца
$month = $monthes[date('n',$date)];
//Года
if(date('Y') != date('Y', $date)) $year = 'Y г.';
else $year = '';
$result_date = date('j '.$month.' '.$year.$time, $date);
return $result_date;
}
echo date_smart('2008-09-14 23:34:59');
чтобы она выводила дату таким образом
Сегодня в 19:00
Вчера в 18:00
3 сентебря 2013 в 15:00
 |
Вопрос задал: Shouldercannon (статус: Посетитель)
Вопрос отправлен: 13 ноября 2013, 06:24
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: Ins
Здравствуйте, Shouldercannon!
Код написан что называется на коленке. Поэтому рекомендую критические участки поместить в try catch
$date = '19-11-2012 17:21:34';
/**
* @param $date_input
* @param bool $time
* @return string
*/
function date_smart($date_input, $time = false)
{
$months = array(
'', 'января', 'февраля', 'марта', 'апреля', 'мая', 'июня',
'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'
);
$input = new DateTime($date_input);
$curr_date = new DateTime();
$interval = $input->diff($curr_date);
$diff = (int)$interval->format('%a');
switch ($diff) {
//позавчера, интервал между датами два дня
case 2:
$result = 'Позавчера';
break;
//вчера, интервал между датами один день
case 1:
$result = 'Вчера';
break;
//сегодня, интервал между датами ноль дней
case 0:
$result = 'Сегодня';
break;
// если временной интервал больше двух дней или меньше нуля
default:
$result = date('d ');
$month = $input->format('m');
$result .= $months[$month];
$result .= $input->format(' Y');
break;
}
if ($time){
$result .= $input->format(' в H:i');
}
return $result;
}
echo date_smart($date);
 |
Ответ отправил: Ins (статус: 1-ый класс)
Время отправки: 20 ноября 2013, 20:04
|
Мини-форум вопроса
Всего сообщений: 1; последнее сообщение — 20 ноября 2013, 18:05; участников в обсуждении: 1.
|
Ins (статус: 1-ый класс), 20 ноября 2013, 18:05 [#1]:
Здравствуйте Shouldercannon:
В коде разбираться не стал(читабельность хромает)
Посмотрите в сторону:
http://www.php.net/manual/ru/datetime.diff.php
Потом в зависимости от разницы формируйте результирующую строку.
PS В Вашем случае лучше не использовать конструкцию if-elseif.
В данной ситуации больше подойдет switch с дефолтным значением.
|
5 апреля 2014, 17:35: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|