26

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

例如像这样

moment().set('server time')

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

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

更新了代码示例和摘要

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

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

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

如果你想改变 Moment 看到的时间,你可以指定一个方法来返回自 Unix 纪元(1970 年 1 月 1 日)以来的毫秒数。

默认值为:

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

这将在调用时使用moment(),并且在省略标记时使用当前日期 format()。通常,任何需要当前时间的方法都会在后台使用它。

更改时间源

于 2019-04-02T10:02:03.050 回答
0

让我们试试这个:

var momentFromServer = moment(input);

var clampedMoment = momentFromServer.max();

我发现在 momentjs 文档中提到了这一点。

有时,服务器时钟与客户端时钟并不完全同步。这最终会显示人性化的字符串,例如“几秒钟内”而不是“几秒钟前”。您可以使用 moment#max() 来防止这种情况: https ://momentjs.com/docs/#/manipulating/max/

于 2021-10-15T09:50:00.860 回答