Moment.js从服务器设置基准时间

时间:2013-10-28 07:53:34

标签: javascript date momentjs

我一直在阅读文档,似乎找不到从服务器而不是客户端设置日期的方法?

例如像

这样的东西
moment().set('server time')

然后 moment()将根据服务器的时间返回Date对象,而不是来自客户端计算机的时间。

此功能是否存在,如果不存在,您将使用哪些推荐方法?现在我正在轮询服务器以获取服务器的时间,但是你可以想象这不是很有效。

更新代码示例和摘要

我正在建立拍卖申请。所以服务器时间至关重要。例如,如果用户已经篡改了他们的时间设置或者他们的时间已经手动配置,则客户端可能会看到已经结束的拍卖,而实际上它还剩下几分钟。所有时间检查显然都在服务器上完成,但这就是我需要客户端和服务器同步的原因。现在您可以看到我正在轮询服务器以获取每隔几秒钟的最新时间。但是我需要设置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')

3 个答案:

答案 0 :(得分:22)

执行此操作的最佳方法是向服务器询问当前时间,然后计算服务器时间与客户端时间之间的偏移量。然后,函数可以使用当前客户端日期并应用服务器差异在任何阶段返回服务器时间。

以下是一个例子:

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);
}

答案 1 :(得分:21)

从Moment.js 2.10.7开始,可以change the time source(参见引入它的PR)。

您可以使用它来将Moment.js看到的时间与服务器的时间同步。

function setMomentOffset(serverTime) {
  var offset = new Date(serverTime).getTime() - Date.now();
  moment.now = function() {
    return offset + Date.now();
  }
}

答案 2 :(得分:0)


title:更改时间源 版本:2.11.0 签名:|

moment.now = function(){return + new Date(); }

如果要更改Moment看到的时间,可以指定一种方法 返回自Unix时代(1970年1月1日)以来的毫秒数。

默认值为:

moment.now = function () {
    return +new Date();
}

在调用moment()时将使用此名称,而在从中省略令牌时使用的当前日期 format()。通常,任何需要当前时间的方法都可以在后台使用。

Changing Time Source