如何在javascript中伪造时间?

如何在javascript中伪造时间?,javascript,Javascript,我想模拟日期构造函数,以便无论何时调用new Date(),它都会返回特定的时间 我发现Sinon.js提供了用于模拟时间的usefaketimer。但是下面的代码不适合我 sinon.useFakeTimers(new Date(2011,9,1)); //expect : 'Sat Oct 01 2011 00:00:00' , //result : 'Thu Oct 27 2011 10:59:44‘ var d = new Date(); 像这样的怎么样? var oldDate=

我想模拟日期构造函数,以便无论何时调用new Date(),它都会返回特定的时间

我发现Sinon.js提供了用于模拟时间的usefaketimer。但是下面的代码不适合我

sinon.useFakeTimers(new Date(2011,9,1));

//expect : 'Sat Oct 01 2011 00:00:00' ,

//result : 'Thu Oct 27 2011 10:59:44‘
var d = new Date();

像这样的怎么样?
var oldDate=日期;
日期=函数(假)
{
返回新的旧日期(“1980年8月3日”);
}
var x=新日期();

文件。编写(x)
sinon.useFakeTimers
接受时间戳(整数)作为参数,而不是日期对象

试一试

clock = sinon.useFakeTimers(new Date(2011,9,1).getTime());
new Date(); //=> return the fake Date 'Sat Oct 01 2011 00:00:00'

clock.restore();
new Date(); //=> will return the real time again (now)

如果使用类似于
setTimeout
的任何操作,请确保阅读文档,因为
useFakeTimers
将中断该代码的预期行为

这就是我的项目所需要的。有点复杂,但据我所知,这一切都是必要的。内部日期()是一个奇怪的野兽。下面的代码也使用下划线

(窗口| |全局)。日期=(函数(orgDate){
var fakeDate=功能(y、m、d、ho、mi、se、mil){
var回溯日期;
如果(arguments.length>3){
backendDate=新起始日期(y、m、d、ho | 0、mi | 0、se | 0、mil | 0);
}else if(arguments.length>1){
backendDate=新组织日期(y,m | 0,d | 0);
}else if(arguments.length>0){
backendDate=新组织日期(y);
}否则{
backendDate=新的orgDate();
backendDate.setFullYear(2015);//我最后做了:

var oldDate = Date;
Date = function (fake)
{
    if( ! fake ) return new oldDate('02/26/2017');

    return new oldDate(fake);
}
Date.prototype = oldDate.prototype;
您还可以使用:


sinon.useFakeTimers在内部使用lolex。因此它支持对象作为

相当于

sinon.useFakeTimers({
now:new Date(2019,1,1)
}) 
我的任务是在每个集成测试中使用相同的开始日期(因为日期应该与文件中的数据相连接) 那么我是如何使用它的呢

 clock = sinon.useFakeTimers({
  now,
  shouldAdvanceTime: true,
  advanceTimeDelta: 20
});
shouldAdvanceTime
将允许lolex和sinon在我的集成测试中不停止计时器。
还可以查看
config.toFake
参数。它可以避免模拟一些函数,如
setTimeout
。或者只模拟
Date
构造函数

只覆盖
Date
Date=function(){return'Sat Oct 01 2011 00:00:00};
这很简洁,但不应用于大型复杂的测试套件。在这种情况下,最好使用Sinon.js,特别是用于处理“还原”(恢复原始日期构造函数)不要忘了在每次会议结束后的
过程中
Date=oldDate
@tothemario为什么选择Sinon而不是这种方法?@guptron-可能是因为他是Sinon.js:)的作者@MikeChristensen这似乎不是问题的关键所在。这个答案最有效,只要你只需要在JS中伪造时间以进行测试,除非你需要Sinon.JS的其他功能。事实上,这不考虑Date.now(),所以我添加了它,并在npm上作为一个小工具发布在这里:
sinon.useFakeTimers({
now:new Date(2019,1,1)
}) 
 clock = sinon.useFakeTimers({
  now,
  shouldAdvanceTime: true,
  advanceTimeDelta: 20
});