Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js从服务器设置基准时间_Javascript_Date_Momentjs - Fatal编程技术网

Javascript js从服务器设置基准时间

Javascript js从服务器设置基准时间,javascript,date,momentjs,Javascript,Date,Momentjs,我一直在阅读文档,似乎找不到从服务器而不是客户端设置日期的方法 举个例子 moment().set('server time') 然后moment()将根据服务器的时间而不是客户端计算机的时间返回日期对象 这个功能是否存在,如果没有,您会使用哪些推荐方法?现在我正在轮询服务器以获取服务器的时间,但正如您所想象的,这不是非常有效 更新了代码示例和摘要 我正在建立一个拍卖申请。因此,服务器时间至关重要。例如,如果用户篡改了他们的时间设置或手动配置了他们的时间,客户机可能会看到拍卖已经结束,而实际上

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

举个例子

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

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

更新了代码示例和摘要 我正在建立一个拍卖申请。因此,服务器时间至关重要。例如,如果用户篡改了他们的时间设置或手动配置了他们的时间,客户机可能会看到拍卖已经结束,而实际上还有几分钟的时间。所有的时间检查显然都是在服务器上完成的,但这就是为什么我需要客户端和服务器保持同步。现在您可以看到我正在轮询服务器,以便每隔几秒钟获取最新时间。但是,我需要设置moment()以从服务器传递的变量调用基准时间。因此,每次调用moment()时,它都以最初传入的时间为基础,而不是以新日期()为基础

在我的应用程序的其他地方,我像这样使用应用程序的服务器时间

collection = new Auction.DealershipBasket [], query: "?$orderby=Ends&$filter=Ends lt datetime'#{app.now}'"
相反,我想调用下面的函数,它返回来自服务器的时间,我只需要使用上面url的get请求配置一次

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

最好的方法是询问服务器一次当前时间,然后计算服务器时间和客户端时间之间的偏移量。然后,通过使用当前客户端日期并应用服务器差异,函数可以在任何阶段返回服务器时间

下面是一个例子:

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开始,就可以(参见介绍它的部分)

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

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

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

moment.now=函数(){return+new Date();} 如果要更改时刻看到的时间,可以指定 返回自Unix纪元(1970年1月1日)以来的毫秒数

默认值为:

moment.now = function () {
    return +new Date();
}
调用
moment()
时将使用该日期,从中省略标记时使用的当前日期
format()
。通常,任何需要当前时间的方法都会在引擎盖下使用该时间


这就是我正在做的,但我每次都必须轮询服务器以获取日期。moment.set抛出没有方法“set”。矩()。设置('time')也不起作用。修改答案以完美地计算服务器日期偏移。谢谢。可以使用响应标题
Date
。跨域(CORS)出现问题,需要
访问控制公开头文件
。必须是准确的服务器时间吗?否则我建议只使用服务器的时区来转换本地时间。由于大多数时钟都是通过时间服务器同步的,因此差异应该非常小(当然,除非有人篡改了他们的时间设置)。请检查更新的问题。我将研究一种方法,即获取一次servertime,然后将差异存储到本地时间。然后,您可以使用自己的函数包装对时刻的调用,该函数会相应地调整时间。Hmmm。非常有趣的想法。我绝对认为这值得一试。我想这一刻可以让你们指定一个基准时间。可能应该看看源代码,看看分叉和添加功能有多容易。获取serverTime的传输时间如何?网络延迟不总是让服务器看起来落后几毫秒吗?如果您正在执行date.fromNow(),则可能会出现问题。您可能会在“几秒钟内”看到刚刚发生的事情。是的,会的,但对于我将时钟设置为在客户端为未设置时钟的Raspberry Pi时显示的用例,这是可以接受的。如果您正在比较的日期来自同一台服务器,那么可能也不会有问题。您可以添加一个条件,检查在“now”之前的日期,如果您有问题,可以说“just now”或其他内容。@RMK我正在使用npm library ntp client获得一个更准确的时间戳,因为协议考虑了往返时间。
moment.now = function () {
    return +new Date();
}