ドキュメントを読んでいて、クライアントではなくサーバーから日付を設定する方法が見つからないようです。
たとえばこのようなもの
moment().set('server time')
次にmoment()は、クライアントのコンピュータからの時間ではなく、サーバーの時間に基づいて日付オブジェクトを返します。
この機能は存在しますか?存在しない場合、どのような推奨方法を使用しますか?現在、サーバーをポーリングしてサーバーの時間を取得していますが、ご想像のとおり、これはあまり効率的ではありません。
オークションアプリを作成しています。したがって、サーバー時間は重要です。たとえば、ユーザーが時間設定を改ざんしたり、時間を手動で設定したりした場合、実際にはまだ数分残っているのに、すでに終了したオークションがクライアントに表示されることがあります。すべての時間チェックは明らかにサーバーで行われますが、クライアントとサーバーを同期させる必要があるのはそのためです。これで、数秒ごとに最新の時刻を取得するためにサーバーをポーリングしていることがわかります。ただし、サーバーから渡す変数から基準時間を呼び出すようにmoment()を設定する必要があります。そのため、moment()を呼び出すたびに、新しい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')
これを行う最善の方法は、サーバーに現在の時刻を1回要求し、サーバーの時刻とクライアントの時刻の間のオフセットを計算することです。関数は、現在のクライアント日付を使用してサーバーの差分を適用することにより、任意の段階でサーバーの時間を返すことができます。
次に例を示します。
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);
}
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();
}
}
タイトル:時間ソースの変更バージョン:2.11.0署名:|
Momentが認識する時間を変更したい場合は、Unixエポック(1970年1月1日)以降のミリ秒数を返すメソッドを指定できます。
デフォルトは次のとおりです。
_moment.now = function () {
return +new Date();
}
_
これは、moment()
を呼び出すときに使用され、format()
からトークンが省略されたときに現在の日付が使用されます。一般に、現在の時刻を必要とするメソッドは、これを内部で使用します。