Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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

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: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:42
Выполнено за 0.06 сек.