2

アクションが実行された後の経過時間を適切に表示する方法について質問があります。単純なコメントシステムがあり、コメントが作成されたときに適切に表示する機能を追加したいと考えています。いくつかの調査を行ったところ、これに遭遇しました:

 function ago($time)
{

$periods = array("second", "minute", "hour", "day", "week", "month", "year", "decade");
$lengths = array("60","60","24","7","4.35","12","10");

  $now = date('Y-m-d h:i:s');
$now=strtotime($now);
if($now>$time)
   $difference     = $now - $time;
   elseif($time>$now)
    $difference     = $time - $now;
   $tense         = "ago";

for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
    $difference /= $lengths[$j];
} 

$difference = round($difference);

if($difference != 1) {
   $periods[$j].= "s";
}

return "$difference $periods[$j] ago ";
 }  

変数 $now を変更して、時刻ではなく日付の値を取得しました。時刻を扱う列を持つテーブルを持つデータベースがあり、datetime に設定されているので、strtotime 関数を使用して変換し、送信します関数を介してそれ:

  $time=$row['time'];
  $time=strtotime($time);
  $ago=ago($time);

問題は、間違った期間が返されることです。たとえば、1 分前にコメントを投稿すると 2 時間前に返されます。タイムゾーンは正しく、実際の日付と時刻も出力します。たとえば、今日は次のように出力します。

  10 hours ago 2013-02-08 12:09:35 2013-02-08 02:18:52

ご覧のとおり、時間の差は 10 時間ではなく、約 2 時間です。誰かがこれを行う方法についてより良いアイデアを持っていますか、またはエラーがどこにあるかを親切に指摘できますか?

4

2 に答える 2

2

問題は、mysql サーバーと php.ini が異なるタイム ゾーンにあることです。1つに固執します。サーバーのタイムゾーンを変更できない場合は、mysql の datetime フィールドから値を取得し、PHP を使用して UNIX タイムスタンプに変換するだけです。

// Start by setting the datetime zone for all your pages in PHP
date_default_timezone_set('Europe/Lisbon');

//Extract the datetime from the database regardless of the databases timezone.
$time = '2012-07-02 22:30:52';

//Then in PHP convert it into a UNIX timestamp.
$timestamp = strtotime($time);

これで、すべてのコードと時間は、関数で指定したタイム ゾーンに相対的になりますdate_default_timezone_set

于 2013-02-08T11:47:48.450 に答える