如何在节点应用程序的实例中更改服务器时间

时间:2013-08-27 15:49:54

标签: node.js

我的应用程序非常依赖于时间。为了使测试更容易,我希望能够在特定时间点启动我的节点应用程序。

NODE_FAKE_TIME=true node app.js 

我在app.js中使用了类似的内容

if(process.env.NODE_FAKE_TIME) { 
  var time = parseInt(moment(moment().format('YYYY-MM-DD 04:00:00')).format('XSSS'));
  var clock = sinon.useFakeTimers(time, "Date");    
}

然而除了使用sinon的useFakeTimers之外,还有更好的方法吗?因为这样做会改变时钟时间....但它会影响setIntervals和setTimeOuts等其他内容。

我只想要一个干净的方式来指定应用程序眼中的时间,以便我在使用Date.now它将在我运行时指定的时间。

谢谢,

2 个答案:

答案 0 :(得分:2)

我在单元测试中通过直接替换Date上的方法来完成这个:

    var oldNow = Date.now;
    var oldGetTime = Date.prototype.getTime;

    Date.now = function() { return 0; }
    Date.prototype.getTime = Date.now;

以上内容将1970年1月1日00:00:00以来的时间设置为零 - 只需将返回的值替换为您感兴趣的时间。

答案 1 :(得分:0)

我发现最好的方法是使用var clock = sinon.useFakeTimers(date,“Date”);然后使用clock.tick(1000)。

允许您通过在时间戳中提供日期然后指定刻度之间的MS数来指定运行时的日期。

示例:

  var time = some_timestamp_here;
  var clock = sinon.useFakeTimers(time, "Date");

  // Every second tick the clock ahead one hour
  setInterval(function(){
    clock.tick(3600000);
  }, 1000);