0

我知道这个问题之前已经被问过 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 日期时间传递给 getElapsedTime() 并使用 convert_datetime() 函数将其转换为时间戳并使用它来获取字符串。

但是当日期预计返回“分钟”或“秒”时,它返回负值。例如,“2013-05-23 15:59:58”返回“-182 分钟前”..

有人知道如何完成吗?

4

2 回答 2

2

这使用 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");
}

$diffDateInterval的一个实例。

如果您希望可以使用以下命令指定您接收的格式$time_stamp:-

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

显然,您可以调整输出格式以适应.

于 2013-05-23T11:24:00.667 回答
1

// 试试这个函数

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
于 2013-05-23T11:09:27.847 回答