0

私はこの質問が以前に2〜3回尋ねられたことを知っており、それらの質問の回答の1つで見つけた機能を使用しています(ここで確認してください)が、うまく機能していないようです。コメントで返信がありませんでしたので、ここで新しい質問を開きます。以下は、datetime(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; 
}  

関数 getElapsedTime() がタイムスタンプを期待していると思ったので、mysql の日時の日付をタイムスタンプに変換する関数 convert_datetime() をもう 1 つ追加しました。だから今、私はmysqlの日時をgetElapsedTime()に渡し、convert_datetime()関数を使用してタイムスタンプに変換し、それを使用して文字列を取得しています。

ただし、日付が「分」または「秒」に返されることが期待される場合、負の値で返されます。たとえば、「2013-05-23 15:59:58」に対して「-182 分前」を返します。

誰もそれを成し遂げる方法を知っていますか?

4

2 に答える 2

2

This is much simpler using PHP's DateTime classes:-

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 is an instance of DateInterval.

If you wish you can specify the format you are receiving in $time_stamp by using:-

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

Obviously you can adjust the output format to suit.

于 2013-05-23T11:24:00.667 に答える