2

mysql テーブルのタイムスタンプをWeb サイトの相対時間 ( 4 秒前、5 か月前など) に変換する方法を段階的に知りたいです。

参考までに、タイムスタンプ列の名前creationは 、テーブルの名前はusersです。

私が試したコード:

function relativedate($secs) {
    $second = 1;
    $minute = 60;
    $hour = 60*60;
    $day = 60*60*24;
    $week = 60*60*24*7;
    $month = 60*60*24*7*30;
    $year = 60*60*24*7*30*365;

    if ($secs <= 0) { $output = "now";
    }elseif ($secs > $second && $secs < $minute) { $output = round($secs/$second)." second";
    }elseif ($secs >= $minute && $secs < $hour) { $output = round($secs/$minute)." minute";
    }elseif ($secs >= $hour && $secs < $day) { $output = round($secs/$hour)." hour";
    }elseif ($secs >= $day && $secs < $week) { $output = round($secs/$day)." day";
    }elseif ($secs >= $week && $secs < $month) { $output = round($secs/$week)." week";
    }elseif ($secs >= $month && $secs < $year) { $output = round($secs/$month)." month";
    }elseif ($secs >= $year && $secs < $year*10) { $output = round($secs/$year)." year";
    }else{ $output = " more than a decade ago"; }

    if ($output <> "now"){
        $output = (substr($output,0,2)<>"1 ") ? $output."s" : $output;
    }
    return $output;
}



echo relativedate(60); // 1 minute
4

3 に答える 3

3

相対時刻/日付を表示するには、CASE を使用します。このコードでテーブル「サンプル」を作成しました。

SELECT *, CASE
WHEN creation between date_sub(now(), INTERVAL 60 minute) and now() THEN concat(minute(TIMEDIFF(now(), creation)), ' minutes ago')
WHEN datediff(now(), creation) = 1 THEN 'Yesterday'
WHEN creation between date_sub(now(), INTERVAL 24 hour) and now() THEN concat(hour(TIMEDIFF(NOW(), creation)), ' hours ago')
ELSE date_format(creation, '%a, %m/%d/%y')
END as date FROM sample 

これにより、相対時間を出力するために使用できる新しい列「日付」が作成されます。

于 2013-06-27T05:23:14.007 に答える
2

私は Jm Verastigue が好きで、現在の年内の日付と今年以外の日付を強化するためにもう少し調整し、utc_time でのみ作業しましたが、now()アプローチも有効です。

SELECT 
report_time,
convert(CASE
    WHEN
        report_time between date_sub(utc_timestamp(),
            INTERVAL 60 minute) and utc_timestamp()
    THEN
        concat(minute(TIMEDIFF(utc_timestamp(), report_time)),
                ' minutes ago')
    WHEN datediff(utc_timestamp(), report_time) = 1 THEN 'Yesterday'
    WHEN
        report_time between date_sub(utc_timestamp(), INTERVAL 24 hour) and utc_timestamp()
    THEN
        concat(hour(TIMEDIFF(utc_timestamp(), report_time)),
                ' hours ago')
    WHEN
        year(report_time) >= year(utc_timestamp())
    THEN
        date_format(report_time, '%e %b')
    ELSE date_format(report_time, '%Y-%m-%d')
END using utf8) as `LekkerDate`

FROM
        _smry_prodinfo
    group by `LekkerDate`;
于 2013-09-12T09:54:54.013 に答える
0

PHP 経由で要求したことを行うことができます (「時間前」と呼ばれます)。

  • これは、github の PHP プラグイン、php-time-agoです。
  • ここに関連する SO の質問time_elapsed_string()があります - 関数とtime_ago()関数を試してください
  • クライアント側で変換を行いたい場合は、jQuery プラグインもあります
于 2013-06-27T05:32:31.480 に答える