Как подделать время в 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();
Ответы
Ответ 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;