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

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

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's的TimeTimers之外,还有更好的方法吗? 因为通过这样做是的,它会改变时钟的时间….但是它会影响其他的东西像setIntervals和setTimeOuts。

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

谢谢,

我在unit testing中通过直接replaceDate中的方法来完成此操作:

  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到零 – 只需用您感兴趣的时间replace返回的值。

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

允许您在运行时指定date应该在什么时间,通过在时间戳中提供date,然后指定tick之间有多less个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);