1

機能してから時間がかかる通知システムを作っています。

私はこのスクリプトをtimesincefunction(jQuery)に使用しています:

$.fn.updateSince = function(interval) {
    var times = this.map(function(){ return { e: $(this), t: parseInt($(this).html()) }; });

    var format = function(t) {
        if(t > 86400) {
            return Math.floor(t / 86400) + ' days ago';
        } else if (t > 3600) {
            return Math.floor(t / 3600) + ' hours ago';
        } else if (t > 60) {
            return Math.floor(t / 60) + ' minute ago';
        } else if (t > 50) {
            return '50 seconds ago';
        } else if (t > 40) {
            return '40 seconds ago';
        } else if (t > 30) {
            return '30 seconds ago';
        } else if (t > 25) {
            return '25 seconds ago';
        } else if (t > 15) {
            return '15 seconds ago';
        } else if (t > 10) {
            return '10 seconds ago';
        } else {
            return 'a few seconds ago';
        }
    }
    var update = function(){
        var now = new Date().getTime();
        $.each(times, function(i, o){
            o.e.html(format(Math.round((now - o.t) / 1000)));
        });
    };

    window.setInterval(update, interval);
    update();
    return this;
}

通知はMySQLデータベースに保存され、各通知には次の形式のタイムスタンプがあります:2012-12-26 06:21:28

PHP strtotimeを使用し、通知項目ごとにデータベースからタイムアウトを取得するときにUTC形式に変更します:(php)

 $rows['time']= strtotime($temp_time." UTC");

ajaxを使用して、それをクライアントブラウザに戻すとき。UTC時間(データベースから)に1000(javascript)を掛けます

 var time = parseInt(dbtime * 1000);

次に、jQueryのtimesince関数を使用して、それを時間前に変換できます。

問題: サーバーの時間はクライアントのブラウザの時間によって異なります。それらを互いに「互換性がある」ようにするにはどうすればよいですか。

たとえば、クライアントのブラウザに応じて2時間前に通知が行われます。しかし、PHPは7時間前に作ったと言っています。クライアントブラウザのタイムゾーンがサーバーのタイムゾーンと異なるため

私の論理は次のとおりです。1。[PHP]現在の時刻を取得し、データベースから取得した通知時刻を使用して減算します。データベース時間-現在の時間=サーバー側の時差

  1. [PHP]それから時差が出ます。この場合は7時間です。
  2. [PHP] 7時間をUTC形式に変換するにはどうすればよいですか?
  3. [Javascript]現在のクライアントブラウザの時刻をUTC形式でphpスクリプトに送信します。
  4. [PHP]クライアントブラウザ時間-7時間(UTC?)=javascriptを使用するために作成された通知の実際の時間。
  5. [PHP]結果をJavascriptに送り返すので、クライアントブラウザ側で2時間前になる可能性があります。

どうすればよいですか?

情報のためだけに、UTC形式は次のようになります(1000を掛けたもの):1314952284779

4

4 に答える 4

0

JavaScriptのUTC時間を返す情報new Date().getTime()の場合、クライアントクロックが正しい限り、これは、ユーザーのさまざまなタイムゾーンを処理する必要がないことを意味します。必要なのは、サーバーからの時刻をUTCで提供することだけです。

PHPでは、gmdate関数を使用してUTC時間文字列を作成するか、単にフォーマットせずに、関数から取得した生のUNIXUTC時間を送信する必要がありtimeます。

要するにどこでもUTCで、それからそれは働きます。ボーナスとして、夏時間が存在しなかったように機能します。

また、ページが最初に読み込まれたときに「現在」のタイムスタンプを送信し、それがクライアントにある時間の長さを計算し、この結果を今後のすべての計算から差し引くことで、クライアントの誤った時間を考慮して調整することもできます。しかし、事実上すべてのコンピューターがタイムサーバーの時計に自動的に時計を調整することを考えると、コンピューターの時計が数秒以上ずれていることは非常にまれです。

于 2013-01-26T14:36:18.527 に答える
0

ユーザーのIPをデータベースに保存し、それを場所に変換してタイムゾーンを取得し、この機能を使用するという同じ問題がありました。これを行う主な理由は、将来、ユーザーに関する情報を取得することを検討する可能性があるため、そのアプローチも役立つからです。間隔トリガー関数を使用してコードを実行できます

 j(document).ready(function () {
        window.initial = 0;
        window.setInterval(timeincrement, 60000);
        function timeincrement() {
            initial = initial + 60;
            j('.coment').each(function () {
                var timefromserver = j(this).find('input[type=hidden]').val();
                timefromserver = parseInt(timefromserver);


                if ((timefromserver / 216000) < 1) {

                    var secgone = timefromserver + initial;
                    var timeelasped = secgone / 60;

                    if (Math.floor(timeelasped) < 1) {
                        j(this).find('.lightgrey').text("Few seconds ago");
                    } else if (Math.floor(timeelasped) < 60) {
                        var innertext = timeelasped + " minutes ago";
                        j(this).find('.lightgrey').text(innertext);

                    } else if (Math.floor(timeelasped / 60) > 0) {
                        var hourgone = Math.floor(timeelasped / 60);
                        var innertext = hourgone + " hours ago";
                        j(this).find('.fdlightgrey').text(innertext);
                    }
                }
            });
        }
    });
于 2013-01-26T06:52:14.680 に答える
0

mysql データが UTC の場合、JavaScript でDate.getTimezoneOffset()を使用し、履歴時刻 (イベントが発生したとき) を表示するときに、mysql に保存されている時刻 (php 経由で取得) に適用します (オフセットは分単位です: -120 = GMT+2)。 ) ユーザーの場合。

とりとめのない:

また、現在の時刻を mysql データと比較するのにも役立ちます (ユーザーの時計を決して信用してはいけませんが、タイムゾーンは通常正しいです [フリークエント フライヤーのラップトップを除いて、痛い])。

私はユーザーに彼女のタイムゾーンの違いが何であるかを伝えるように注意します (GMT +/- XX を公開するか、「HH:MM これはあなたの現地時間でなければなりません。そうでない場合は時計を修正してください」などの方法で)、確認するように依頼します。必要であれば。あなたのコードは、ユーザーとの関係に応じて状況に対処します (「その時計を修正してください、ダーニット」または「はい、うーん、[アルゼンチンにいますが] パリの時間に合わせて時計を修正してほしいですか?」 )

于 2013-02-08T16:32:23.830 に答える
0

あなたのロジックは次のようになります。

  1. strtotime(または同様の関数)を使用して、通知時間をUNIXタイムスタンプに変換します
  2. この値 (1000 を掛けた値) でJavaScriptDate関数を使用して、日付を再構築します。
  3. (new Date) - thatDate を使用して差を計算します
  4. 時、分、秒に変換

ここで見られる問題は、最初のステップにあります。日付は保存されているとのことですが、2012-12-26 06:21:28この日付はどのタイムゾーンに対応していますか? サーバーのタイムゾーンと同じ時間であれば、strtotime("2012-12-26 06:21:28")正しいタイムスタンプを生成するのに十分です。

于 2013-01-26T07:22:36.250 に答える