在Meteor客户端显示服务器时间

使用meteor,在显示服务器时间的客户端上保持运行时钟(h:m:s)的有效方法是什么?

我发现的JavaScript / PHP的答案通常涉及周期性地获得服务器时间,并计算它和客户端之间的差异。

meteor会是什么样子?

更新:自从我最初发布这个问题以来,发生了很多变化。 如果您对预先构build的解决scheme感兴趣,我build议您使用@mizzao来查看Meteor Timesync 。 通过在控制台中运行meteor add mizzao:timesync来安装它。

大卫·格林斯潘(David Greenspan)14:30左右在Spark的演讲中获得客户的时间。 我稍微修改了这个代码来获得服务器端的时间:

使用Javascript:

 if (Meteor.isClient) { Meteor.startup(function () { setInterval(function () { Meteor.call("getServerTime", function (error, result) { Session.set("time", result); }); }, 1000); }); Template.main.time = function () { return Session.get("time"); }; } if (Meteor.isServer) { Meteor.methods({ getServerTime: function () { var _time = (new Date).toTimeString(); console.log(_time); return _time; } }); } 

而HTML:

 <body> {{> main}} </body> <template name="main"> {{time}} </template> 

这个线程有非常好的信息。 我已经把所有东西都集成到一个meteor的智能包中:

https://github.com/mizzao/meteor-timesync

除了这里已经添加的东西外,还有两件主要的事情:

  • 使用NTP风格的math计算更准确的服务器/客户端偏移量,而不仅仅是区分客户端和服务器时间,而忽略往返时间。
  • 能够react native地使用服务器时间戳来显示将在模板和反应式计算中自行更新的值。

随意打开拉请求,特别是如果你有更好/更有效的方法来计算和维护偏移量的想法。

感谢@TimDog的帮助。 我已经扩展了这个代码,只在客户端上运行时钟的时候才定期检查服务器。 这是我结束了:

客户代码:

  Meteor.startup(function () { function setServerTime(){ //get server time (it's in milliseconds) Meteor.call("getServerTime", function (error, result) { //get client time in milliseconds localTime = new Date().getTime(); //difference between server and client var serverOffset = result - localTime; //store difference in the session Session.set("serverTimeOffset", serverOffset); }); } function setDisplayTime(){ var offset = Session.get("serverTimeOffset"); var adjustedLocal = new Date().getTime() + offset; Session.set("serverTime", adjustedLocal); } //run these once on client start so we don't have to wait for setInterval setServerTime(); setDisplayTime(); //check server time every 15min setInterval(function updateServerTime() { setServerTime(); }, 900000); //update clock on screen every second setInterval(function updateDisplayTime() { setDisplayTime(); }, 1000); }); //pass the clock to the HTML template Template.register.clock = function () { return new Date(Session.get("serverTime")); }; 

服务器代码:

 Meteor.methods({ //get server time in milliseconds getServerTime: function () { var _time = (new Date).getTime(); console.log(_time); return _time; } }); 

作为这个问题的后续,这是一个性能stream失? 我们正在计算每秒的偏移量,并根据这个重新计算来改变Session。

这是否意味着其他依赖Session的东西也会每秒重新计算?

可能更好地设置别的东西?

或者简单地做一个方法,根据需要进行本地date调整,设置间隔和会话variables。

让我知道你find了什么。