| 
| 
 | Вопрос # 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: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |