0

タイムスタンプがあり、ユーザーに表示したいのですが...最後に送信されたのは1日、23時間、54分、33秒前です。私は時間の違いを得る方法を知っています...

$timePast = '2012-08-18 22:11:33';
$timeNow = date('Y-m-d H:i:s');
// gives total seconds difference
$timeDiff = strtotime($timeNow) - strtotime($timePast);

今、私は上記のように時間を表示することができないので立ち往生しています。x日、x時間、x分、x秒。ここで、すべてのxは合計秒の時間差になります。私は次のことを知っています...

$lastSent['h'] = round($timeDiff / 3600);
$lastSent['m'] = round($timeDiff / 60);
$lastSent['s'] = $timeDiff;

助けが必要です!前もって感謝します。

4

4 に答える 4

1

私は Kalpesh のコードを使用し、その日のさまざまな摩擦をfloor代わりに使用して計算することで機能させました。roundここに行きます:

function timeAgo ($oldTime, $newTime) {
    $timeCalc = strtotime($newTime) - strtotime($oldTime);
    $ans = "";
    if ($timeCalc > 60*60*24) {        
        $days = floor($timeCalc/60/60/24);
        $ans .=  "$days days"; 
        $timeCalc = $timeCalc - ($days * (60*60*24));        
    }
    if ($timeCalc > 60*60) {
        $hours = floor($timeCalc/60/60);
        $ans .=  ", $hours hours"; 
        $timeCalc = $timeCalc - ($hours * (60*60));        
    }
    if ($timeCalc > 60) {
        $minutes = floor($timeCalc/60);
        $ans .=  ", $minutes minutes"; 
        $timeCalc = $timeCalc - ($minutes * 60);        
    }    
    if ($timeCalc > 0) {
        $ans .= "and $timeCalc seconds";        
    }
    return $ans . " ago";
} 
$timePast = '2012-08-18 22:11:33';
$timeNow = date('Y-m-d H:i:s');    
$t = timeAgo($timePast, $timeNow);
echo $t;

出力
1日16時間11分18秒前

于 2012-08-20T21:21:42.093 に答える
1

日付の計算を手動で行わないでください。

DateTimePHP は、およびDateIntervalクラスを使用して、すべての日付/時刻計算を実行できます。

2 つの日付の間隔を取得する

$timePast = new DateTime('2012-08-18 22:11:33');
$timeNow  = new DateTime;

$lastSent = $timePast->diff($timeNow);
// $lastSent is a DateInterval with properties for the years, months, etc.

フォーマット例

フォーマットされた文字列を取得するための関数は、次のようになります (ただし、これは多くの超基本的な方法の 1 つにすぎません)。

function format_interval(DateInterval $interval) {
    $units = array('y' => 'years', 'm' => 'months', 'd' => 'days',
                   'h' => 'hours', 'i' => 'minutes', 's' => 'seconds');
    $parts = array();
    foreach ($units as $part => $label) {
        if ($interval->$part > 0) {
            $parts[] = $interval->$part . ' ' . $units[$part];
        }
    }
    return implode(', ', $parts);
}

echo format_interval($lastSent); // e.g. 2 days, 24 minutes, 46 seconds
于 2012-08-20T21:41:15.447 に答える
1

この後:

$timeDiff = strtotime($timeNow) - strtotime($timePast);

追加:

if ($timeDiff > (60*60*24)) {$timeDiff = floor($timeDiff/60/60/24) . ' days ago';}
else if ($timeDiff > (60*60)) {$timeDiff = floor($timeDiff/60/60) . ' hours ago';}
else if ($timeDiff > 60) {$timeDiff = floor($timeDiff/60) . ' minutes ago';}
else if ($timeDiff > 0) {$timeDiff .= ' seconds ago';}

echo $timeDiff;
于 2012-08-20T20:58:42.487 に答える
0

多くのifモジュラス (%)floor() (round() ではない)が必要になります。

またはGoogle ;-)

于 2012-08-20T21:01:40.627 に答える