26

ドキュメントを読んでいますが、クライアントではなくサーバーから日付を設定する方法が見つかりませんか?

たとえば、このようなもの

moment().set('server time')

その場合、 moment()は、クライアントのコンピューターからの時間ではなく、サーバーの時間に基づいて Date オブジェクトを返します。

この機能は存在しますか?存在しない場合、使用する推奨される方法は何ですか? 現在、サーバーをポーリングしてサーバーの時間を取得していますが、ご想像のとおり、これはあまり効率的ではありません。

コード例と要約で更新

オークションアプリケーションを構築しています。したがって、サーバー時間は重要です。たとえば、ユーザーが時間設定を改ざんしたり、時間を手動で構成したりした場合、実際にはまだ数分残っているのに、クライアントには既に終了したオークションが表示されることがあります。すべての時間チェックは明らかにサーバー上で行われますが、クライアントとサーバーを同期させる必要があるのはそのためです。これで、数秒ごとに最新の時刻を取得するためにサーバーをポーリングしていることがわかります。ただし、サーバーから渡す変数から基本時間を呼び出すように moment() を設定する必要があります。したがって、moment() を呼び出すたびに、new Date() ではなく、最初に渡された時刻に基づいています。

app.getTime = ->
    setInterval ->
        $.get app.apiUrl + 'public/time', (time)  -> 
            app.now = moment(time).format('YYYY-MM-DDTHH:mm')
    , app.fetchTimeInterval

アプリケーションの他の場所で、アプリのサーバー時間を次のように使用します

collection = new Auction.DealershipBasket [], query: "?$orderby=Ends&$filter=Ends lt datetime'#{app.now}'"

代わりに、次を呼び出したいと思います。サーバーからの時間を返します。これは、上記の URL からの get 要求で一度だけ構成する必要があります。

 now = moment().format('YYYY-MM-DDTHH:mm')
4

4 に答える 4

30

これを行う最善の方法は、サーバーに現在の時刻を一度問い合わせてから、サーバー時刻とクライアント時刻の間のオフセットを計算することです。関数は、現在のクライアント日付を使用してサーバーの差分を適用することにより、任意の段階でサーバー時間を返すことができます。

次に例を示します。

var serverDate;
var serverOffset;
$.get('server/date/url', function(data){
   // server returns a json object with a date property.
   serverDate = data.date;
   serverOffset = moment(serverDate).diff(new Date());
});

function currentServerDate()
{
    return moment().add('milliseconds', serverOffset);
}
于 2013-10-28T08:01:04.947 に答える
30

Moment.js 2.10.7 以降、タイム ソースを変更することができます (それを導入したPRを参照してください)。

これを使用して、Moment.js が認識している時刻をサーバーの時刻と同期させることができます。

function setMomentOffset(serverTime) {
  var offset = new Date(serverTime).getTime() - Date.now();
  moment.now = function() {
    return offset + Date.now();
  }
}
于 2016-05-11T18:11:39.653 に答える