1

コメントが投稿されてからの経過時間を計算しようとしています。私はこれのための関数を見つけました、そしてそれはうまく働いています

しかし、ユーザーのタイムゾーンが原因で、ユーザーに表示される時間が間違っていることに気づきました。私はいくつかの調査を行いましたが、解決策は、と呼ばれるjavascript関数を使用してユーザーのタイムゾーンオフセットをphpページに渡すgetTimezoneOffsetことであるようです。

問題は、このオフセットを使用してタイムゾーンを作成し、上記でリンクした関数で使用できないことです。別のコードの助けを借りて、私がこれまでに収集できたものです:

function humanTiming ($time,$offset)
{

    $isDST = 1; // Daylight Saving 1 - on, 0 - off
    $timezoneName = timezone_name_from_abbr('', intval($offset, 10) * 36, $isDST);

    $date = new DateTime($time, new DateTimeZone($timezoneName));
    $time = strtotime($date);

    $time = time() - $time; // to get the time since that moment

    $tokens = array (
        31536000 => 'year',
        2592000 => 'month',
        604800 => 'week',
        86400 => 'day',
        3600 => 'hour',
        60 => 'minute',
        1 => 'second'
    );

    foreach ($tokens as $unit => $text) {
        if ($time < $unit) continue;
        $numberOfUnits = floor($time / $unit);
        return $numberOfUnits.' '.$text.(($numberOfUnits>1)?'s':'');
    }

}

そして、このような関数を呼び出しましょう:

echo humanTiming ($row['date'],"-240");

注:-240は、そのjavascript関数を実行して得られる値なので、おそらく私のタイムゾーンオフセットです。

最初の問題:値-240が無効で、のようなものが機能しているよう-0500です。

2番目の問題:有効なオフセット値を試してみても、関数は42 years

この42年がどのように計算されるかはわかりませんが、完全に間違っています。

4

2 に答える 2

4

いくつかの問題: Javascript 関数getTimezoneOffset()はタイムゾーン オフセットを分単位で返しますがtimezone_name_from_abbr()、オフセットは秒単位であると想定しています。あなたの例で-240は、実際には-4数時間または-14396数秒です。数学を少し変更することで、コードを修正できます。

$timezoneName = timezone_name_from_abbr('', intval($offset) * 60, $isDST);

オブジェクトの使用を開始したため、Unix タイムスタンプを取得するためにDateTime使用することはできません。strtotime代わりに次のものが必要ですformat():

$date = new DateTime($time, new DateTimeZone($timezoneName));
$time = $date->format('U');

これにより、目的の結果が得られるはずです。時間が 0 ( false に評価される) に設定されていたため、42 年を取得していましたが、strtotime($date)これは Unix エポック - 1970 年です。

于 2012-09-14T03:43:36.037 に答える