Comment faux temps dans javascript?

Je voudrais simuler le constructeur Date pour que chaque fois que j'appelle la nouvelle Date (), il retourne toujours l'heure précise.

J'ai trouvé Sinon.js fournir UseFakeTimers pour simuler le temps. Mais le code suivant ne fonctionne pas pour moi.

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(); 

sinon.useFakeTimers accepte un timestamp (entier) en tant que paramètre, pas un objet Date.

Essayez avec

 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) 

Si vous utilisez quelque chose comme setTimeout , assurez-vous de lire les documents parce que useFakeTimers perturbera le comportement attendu de ce code.

Que diriez-vous quelque chose comme ça?

 var oldDate = Date; Date = function (fake) { return new oldDate('03/08/1980'); } var x = new Date(); document.write(x); 

C'est ce dont j'avais besoin pour mon projet. Un peu complexe, mais pour autant que je puisse le dire, tout est nécessaire. La date interne () est une bête étrange. En outre, le code ci-dessous utilise underscorejs.

 (window || global).Date = (function (orgDate) { var fakeDate = function (y, m, d, ho, mi, se, mil) { var backendDate; if (arguments.length > 3) { backendDate = new orgDate(y, m, d, ho || 0, mi || 0, se || 0, mil || 0); } else if (arguments.length > 1) { backendDate = new orgDate(y, m || 0, d || 0); } else if (arguments.length > 0) { backendDate = new orgDate(y); } else { backendDate = new orgDate(); backendDate.setFullYear(2015); // <-- Your year here backendDate.setMonth(1); // <-- Your month here backendDate.setDate(2); // <-- Your day here } if (this) { this.backendDate = backendDate; } return backendDate.toString(); } _.each(("getDate getDay getFullYear getHours getMilliseconds getMinutes " + "getMonth getSeconds getTime getTimezoneOffset getUTCDate getUTCDay " + "getUTCFullYear getUTCHours getUTCMilliseconds getUTCMinutes " + "getUTCMonth getUTCSeconds getYear parse setDate setFullYear setHours " + "setMilliseconds setMinutes setMonth setSeconds setTime setUTCDate " + "setUTCFullYear setUTCHours setUTCMilliseconds setUTCMinutes " + "setUTCMonth setUTCSeconds setYear toDateString toGMTString " + "toISOString toJSON toLocaleDateString toLocaleTimeString " + "toLocaleString toString toTimeString toUTCString UTC valueOf").split(" "), function (fnName) { fakeDate.prototype[fnName] = function () { return this.backendDate[fnName].apply(this.backendDate, arguments); } }); return fakeDate; })(window.Date); 

Vous pouvez également utiliser Proxies :

 window.Date = new Proxy(Date, { construct: function(target, args) { if (args.length === 0) { return new target(2017, 04, 13, 15, 03, 0); } return new target(...args); } }); 

J'ai fini par faire:

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