构建聊天应用程序:如何获得时间

时间:2015-04-26 02:10:04

标签: node.js chat real-time pubnub

我正在使用PubNub构建一个聊天应用。现在的问题是从app / frontend的角度来看,它应该如何获得时间(服务器时间)。如果每条消息都发送到服务器,我可以在那里获得服务器时间。但是通过像PubNub这样的第三方服务,我该如何管理呢?由于应用程序将消息发送到PubNub而不是我的服务器。我不想依赖当地时间,因为用户可能有不准确的时钟。

我想到的最简单的解决方案是:当应用启动时,获取服务器时间。记录本地时间和服务器时间之间的差异(diff = Date.now() - serverTime)。发送消息时,时间为Date.now() - diff。到目前为止这是正确的吗?

我想这个解决方案假设0传输(或延迟)时间?是否有更正确或推荐的方法来实现它?

1 个答案:

答案 0 :(得分:2)

您的用例可能是pubnub.time()存在的原因。

事实上,他们甚至有一个描述漂移计算的代码示例。

https://github.com/pubnub/javascript/blob/1fa0b48227625f92de9460338c222152c853abda/examples/time-drift-detla-detection/drift-delta-detection.html

// Drift Functions
function now(){ return+new Date }
function clock_drift(cb) {
    clock_drift.start = now();
    PUBNUB.time(function(timetoken){
        var latency     = (now() - clock_drift.start) / 2
        ,   server_time = (timetoken / 10000) + latency
        ,   local_time  = now()
        ,   drift       = local_time - server_time;
        cb(drift);
    });
    if (clock_drift.ival) return;
    clock_drift.ival = setInterval( function(){clock_drift(cb)}, 1000 );
}
// This is how you use the code
// Periodically Get Latency in Miliseconds
clock_drift(function(latency){
    var out = PUBNUB.$('latency');
    out.innerHTML = "Clock Drift Delta: " + latency + "ms";
    // Flash Update
    PUBNUB.css( out, { background : latency > 2000 ? '#f32' : '#5b5' } );
    setTimeout( function() {
        PUBNUB.css( out, { background : '#444' } );
    }, 300 );
});