Получить нормальную удобочитаемую дату/время с помощью php

Я знаю, что этот вопрос задавался 2-3 раза раньше, и я использую функцию, которую нашел в одном из ответов (проверьте это здесь) из этих вопросов, но, похоже, у меня это не работает, я спросил там в комментариях, но не получить любой ответ, поэтому я открываю новый вопрос здесь. Ниже приведен код для получения даты/времени в виде простого текста из даты и времени (тип mysql).

function getElapsedTime($time_stamp)
{
    $ts = convert_datetime($time_stamp);
    $time_stamp = $ts;
    $time_difference = strtotime('now') - $time_stamp;

    if ($time_difference >= 60 * 60 * 24 * 365.242199)
    {
        return get_time_ago_string($time_stamp, 60 * 60 * 24 * 365.242199, 'year');
    }
    elseif ($time_difference >= 60 * 60 * 24 * 30.4368499)
    {
       return get_time_ago_string($time_stamp, 60 * 60 * 24 * 30.4368499, 'month');
    }
    elseif ($time_difference >= 60 * 60 * 24 * 7)
    {
        return get_time_ago_string($time_stamp, 60 * 60 * 24 * 7, 'week');
    }
    elseif ($time_difference >= 60 * 60 * 24)
    {
        return get_time_ago_string($time_stamp, 60 * 60 * 24, 'day');
    }
    elseif ($time_difference >= 60 * 60)
    {
        return get_time_ago_string($time_stamp, 60 * 60, 'hour');
    }
    elseif($time_difference <= 60)
    {
        return get_time_ago_string($time_stamp, 60, 'minute');
    }
}

function get_time_ago_string($time_stamp, $divisor, $time_unit)
{
    $time_difference = strtotime("now") - $time_stamp;
    $time_units      = floor($time_difference / $divisor);

    settype($time_units, 'string');

    if ($time_units === '0')
    {
        return 'less than 1 ' . $time_unit . ' ago';
    }
    elseif ($time_units === '1')
    {
        return '1 ' . $time_unit . ' ago';
    }
    else
    {
       return $time_units . ' ' . $time_unit . 's ago';
    }
}

function convert_datetime($str) { 

   list($date, $time) = explode(' ', $str); 
   list($year, $month, $day) = explode('-', $date); 
   list($hour, $minute, $second) = explode(':', $time); 

   $timestamp = mktime($hour, $minute, $second, $month, $day, $year); 

   return $timestamp; 
}  

Я добавил еще одну функцию convert_datetime(), которая превращает дату и время mysql в отметку времени, так как я думал, что функция getElapsedTime() ожидает отметку времени, потому что, когда я передавал обычную дату и время (формат mysql), она не работала. Итак, теперь я передаю mysql datetime в getElapsedTime() и преобразовываю его в метку времени с помощью функции convert_datetime() и использую ее для получения строки.

Но когда ожидается, что дата вернется в течение «минуты» или «секунды», она вернется в отрицательном значении. например, его возвращение "-182 минуты назад" для "2013-05-23 15:59:58"..

Кто-нибудь знает, как это сделать?


person vikas devde    schedule 23.05.2013    source источник
comment
Мне нужно что-то подобное для нового проекта, моя реализация здесь. Не стесняйтесь использовать его, он находится в стадии разработки, так что он будет меняться.   -  person vascowhite    schedule 25.05.2013


Ответы (2)


// попробуй эту функцию

function time_ago($ptime) {
  $ptime = strtotime($ptime);
  if ($ptime) {
    $etime = time() - $ptime;
    if ($etime < 1)
      return 'few seconds';
    $a = array(
        12 * 30 * 24 * 60 * 60 => 'year',
        30 * 24 * 60 * 60 => 'month',
        24 * 60 * 60 => 'day',
        60 * 60 => 'hour',
        60 => 'minute',
        1 => 'second'
    );
    foreach ($a as $secs => $str) {
      $d = $etime / $secs;
      if ($d >= 1) {
        $r = round($d);
        return $r . ' ' . $str . ($r > 1 ? 's' : '') . '';
      }
    }
  }
  return '0';
}

// Применение

echo time_ago('2013-05-23 15:59:58');

echo time_ago(date('Y:m:d H:i:s'));

// Выход

43 minutes

few seconds
person Dino Babu    schedule 23.05.2013
comment
Вы уверены, что ваш вывод правильный? Я получаю «несколько секунд» для «2013-05-23 15:59:58» - person vikas devde; 23.05.2013
comment
системная дата и время идеальны - person vikas devde; 23.05.2013
comment
вот ваш вывод для этого - echo date('Y:m:d H:i:s'); ? - person Dino Babu; 23.05.2013
comment
есть какая-то проблема, я думаю, как вы сказали, я повторил эту дату ('Y:m:d H:i:s'), и я получил это 2013:05:23 13:19:27 как это? Сейчас 16:50, а показывает 13:19? - person vikas devde; 23.05.2013
comment
часовой пояс указан правильно (UTC+05:30) Ченнаи, Калькутта, Мумбаи, Нью-Дели - person vikas devde; 23.05.2013
comment
теперь я забавляюсь date_default_timezone_set('Asia/Kolkata') и выдаю правильный вывод - person vikas devde; 23.05.2013
comment
спасибо за помощь, я думаю, это был часовой пояс сервера, который создавал проблему, решено, спасибо +1 - person vikas devde; 23.05.2013

Это намного проще сделать с помощью PHP-классов DateTime:

function time_ago($time_stamp)
{
    $time = new DateTime($time_stamp);
    $now = new DateTime();
    $diff = $now->diff($time);

    return $diff->format("%h hours, %i minutes ago");
}

$diff является экземпляром DateInterval.

При желании вы можете указать формат, который вы получаете в $time_stamp, используя :-

$time = DateTime::createFromFormat('Your format here');

Очевидно, что вы можете настроить формат вывода в соответствии с вашими потребностями.

person vascowhite    schedule 23.05.2013