3

わかりました、これは一種の奇妙な質問です。私の変更の 1 つで、PHP コードは time() を使用してタイムスタンプをデータベースに保存します。私の知る限り、これは UTC タイムゾーンを使用します。ここで、このデータを取得して、Javascript 関数のパラメーターとして使用します。この関数は、「30 秒前」や「2 時間 30 分前」などのような時刻文字列を返します。完全な関数は次のとおりです。

time_string : function(seconds,complexity,seconds_left,suffix,prefix){
    var difference = Math.abs(dynamo.time - seconds);
    seconds_left = seconds_left == null ? 0 : seconds_left;
    seconds = +seconds;
    if(difference < 15 && !seconds_left){
        return "Just now";
    }
    suffix = suffix != null
        ? (seconds_left == 1
            ? ""
            : suffix)
        : (seconds_left == 1
            ? ""
            : " ago");
    prefix = prefix != null ? prefix : "";
    if(difference > 86400){
        return new Date(seconds * 1000).toDateString();
    } else {
        var years = Math.floor(difference / 31536000);
        var days = Math.floor((difference / 86400) % 365);
        var hours = Math.floor((difference / 3600) % 24);
        var minutes = Math.floor((difference / 60) % 60);
        var second = difference % 60;
        var time_str = [];
        if(years > 0) time_str[time_str.length] = dynamo.toolbox.format_number(years) + " year" + (years == 1 ? '' : 's');
        if(days > 0) time_str[time_str.length] = days + " day" + (days == 1 ? '' : 's');
        if(hours > 0) time_str[time_str.length] = hours + " hour" + (hours == 1 ? '' : 's');
        if(days <= 1){
            if(minutes > 0) time_str[time_str.length] = minutes + " minute" + (minutes == 1 ? '' : 's');
            if(second > 0 && !minutes && !hours && !days){
                time_str[time_str.length] = second + " second" + (second == 1 ? '' : 's');
            }
        }
        complexity = complexity != null ? complexity : 2;
        time_str = time_str.slice(0,complexity);
        if(time_str.length > 1){
            var final_str = time_str[time_str.length-1];
            time_str.pop();
            time_str = time_str.join(", ") + " and " + final_str;
        } else {
            time_str = time_str.join("");
        }
    }
    return prefix + time_str + suffix;
}

コードでは、dynamo.timeが使用されています。dynamo.timePHPからの現在の値に設定さtime()れます (保存された時刻と現在の時刻の差を計算するために使用します)。

ただし、differenceサーバーと比較したクライアントのタイムゾーンの違いを考慮して変数を調整する必要があります (以前と同様に、UTC であると思います)。

どうすればこれを行うことができますか?

必要に応じて、関数のテストを行った JS Fiddle を次に示します: http://jsfiddle.net/Jskjv/1/

編集:これを達成するために new Date().getTimezoneOffset() を台無しにすることはできますか? 唯一のことは、DST との不一致があることです。

4

1 に答える 1

0

混乱がどこから来ているのかわかりません。訪問者のシステム時刻が十分であると仮定すると、任意のタイムスタンプをこれと比較できます。

Math.round(new Date().getTime() / 1000)

また、同じ種類のUNIXタイムスタンプを返すため、タイムゾーンオフセットの複雑さはありません。

ユーザーのシステム時計がめちゃくちゃになっている可能性があります。そのような場合、時間オフセット計算を行うことができます。これにより、PHPtime()はインラインJavaScriptを介して渡されます。繰り返しますが、タイムゾーンはありません:)

于 2012-08-14T23:56:04.657 に答える