41 votes

Comment simuler du temps en javascript ?

Je voudrais me moquer du constructeur de Date afin que chaque fois que j'appelle une nouvelle Date(), elle renvoie toujours une heure spécifique.

J'ai trouvé Sinon.js fournir useFakeTimers pour se moquer de l'heure. 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();

61voto

tothemario Points 1041

sinon.useFakeTimers accepte un horodatage (entier) comme 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 car le useFakeTimers perturbera le comportement attendu de ce code.

29voto

Mike Christensen Points 29735

Que diriez-vous de quelque chose comme ça ?

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

var x = new Date();
document.write(x);

Vous alliez alors, bien sûr, courir :

Date = oldDate;

Quand vous vouliez rétablir un comportement normal.

11voto

user238282 Points 28

Vous pouvez également utiliser des 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);
    }
});

2voto

Bjorkegeek Points 48

C'est ce dont j'avais besoin pour mon projet. Un peu complexe, mais pour autant que je sache, tout est nécessaire. La Date interne () est une bête étrange. Aussi le code ci-dessous utilise des 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);

0voto

Jan Prichystal Points 116

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;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X