我知道这个问题之前已经被问过 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 分钟前”..
有人知道如何完成吗?