0

mysql タイムスタンプを月、日、時間、または分単位の時間に変換しようとしています。

したがって、出力は次のようになります。

1 か月前に追加 / 0 時間前に追加 / 21 分前に追加 / 30 秒前に追加

したがって、何分、何時間、何日などに応じて 1 つの形式の時間のみが必要なため、60 分は 1 時間前に変換され、24 時間は 1 日前に変換され、48 時間は 2 日前に変換されます。

これまでのところ、私はこのコードを持っています:

<?
    $datetime1 = new DateTime();
    $datetime2 = new DateTime ($news['date_added']);
    $interval = $datetime1->diff($datetime2);
    str_replace('0 hours', '', $variable);
    echo $interval->format('%h hours %i minutes');
    ?>

これにより、次のように出力されます。

0 時間前 57 分前に追加されました。

誰かが私を助けたり、フォーマットを正しく表示するためにidが何をする必要があるかを教えてくれますか? ありがとうございました。

4

2 に答える 2

3

http://php.net/manual/en/ref.datetime.phpから

関数を呼び出すときに $precision を 1 に変更し、日付の前後に任意のテキストを追加します。日付オブジェクトをタイムスタンプに変換する必要がありますが、それは問題にはなりません。

/**
 * this code assumes php >= 5.1.0. if using < 5.1, read
 * php.net/strtotime and change the condition for checking
 * for failure from strtotime()
 */

// $t1, $t2: unix times, or strtotime parseable
// $precision: max number of units to output
// $abbr: if true, use "hr" instead of "hour", etc.
function date_diff ($t1, $t2, $precision = 6, $abbr = false) {
    if (preg_match('/\D/', $t1) && ($t1 = strtotime($t1)) === false)
        return false;

    if (preg_match('/\D/', $t2) && ($t2 = strtotime($t2)) === false)
        return false;

    if ($t1 > $t2)
        list($t1, $t2) = array($t2, $t1);

    $diffs = array(
        'year' => 0, 'month' => 0, 'day' => 0,
        'hour' => 0, 'minute' => 0, 'second' => 0,
    );

    $abbrs = array(
        'year' => 'yr', 'month' => 'mth', 'day' => 'day',
        'hour' => 'hr', 'minute' => 'min', 'second' => 'sec'
    );

    foreach (array_keys($diffs) as $interval) {
        while ($t2 >= ($t3 = strtotime("+1 ${interval}", $t1))) {
            $t1 = $t3;
            ++$diffs[$interval];
        }
    }

    $stack = array();
    foreach ($diffs as $interval => $num)
        $stack[] = array($num, ($abbr ? $abbrs[$interval] : $interval) . ($num != 1 ? 's' : ''));

    $ret = array();
    while (count($ret) < $precision && ($item = array_shift($stack)) !== null) {
        if ($item[0] > 0)
            $ret[] = "{$item[0]} {$item[1]}";
    }

    return implode(', ', $ret);
}

$t1 = 'Feb 4, 2008 12:16:00';
$t2 = 'Jul 3, 2006 16:15:30';

echo date_diff($t1, $t2), "\n",
    date_diff($t1, $t2, 3), "\n",
    date_diff($t1, $t2, 2, true), "\n";

?>
于 2013-02-04T17:37:22.680 に答える
1

これが可能な解決策です。時差をmonths-days-hours-minutes-secondsの文字列としてフォーマットし、その文字列を調べて最初のゼロ以外の数値を探します。これが必要な数値です...

$mdhms = explode('-',$interval->format('%m-%d-%H-%i-%s'));

$labels = Array(' months', ' days', ' hours', ' minutes', ' seconds');
$i = 0;
foreach($mdhms as $t){
  if($t > 0) break;
  $i+=1;
}
if ($i < 5) echo "It happened ".$t.$labels[$i]." ago";
else echo "It is happening right now!"
于 2013-02-04T17:46:16.687 に答える