Подтвердить что ты не робот

Как подделать время в javascript?

Я хотел бы высмеять конструктор Date, чтобы всякий раз, когда я вызываю новую Date(), он всегда возвращает определенное время.

Я обнаружил, что Sinon.js предоставляют useFakeTimers, чтобы высмеять время. Но следующий код для меня не работает.

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

Ответ 1

sinon.useFakeTimers принимает метку времени (целое число) как параметр, а не объект Date.

Попробуйте

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 нарушит ожидаемое поведение этого кода.

Ответ 2

Как насчет чего-то подобного?

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

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

Ответ 3

Вы также можете использовать 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);
    }
});

Ответ 4

Это то, что мне нужно для моего проекта. Немного сложный, но насколько я могу сказать, все это необходимо. Внутренняя дата() - это странный зверь. Также приведенный ниже код использует 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);

Ответ 5

Я закончил работу:

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

    return new oldDate(fake);
}
Date.prototype = oldDate.prototype;