重写Javascript日期构造函数?
我正在开发一个对当前日期敏感的浏览器应用程序 在我的应用程序代码中,我调用重写Javascript日期构造函数?,javascript,date,Javascript,Date,我正在开发一个对当前日期敏感的浏览器应用程序 在我的应用程序代码中,我调用newdate,根据当前时间执行计算,并相应地呈现视图 为了在不同的日历日测试我的应用程序,我必须不断地将我的系统时钟更改为过去或未来,这是一种烦恼,可能对我的计算机不健康 因此,纯粹出于测试目的(我不会在生产中使用此代码),我决定通过在控制台中执行以下操作来覆盖内置的Date构造函数: // create a date object for this Friday: var d = new Date(2012, 0, 2
newdate
,根据当前时间执行计算,并相应地呈现视图
为了在不同的日历日测试我的应用程序,我必须不断地将我的系统时钟更改为过去或未来,这是一种烦恼,可能对我的计算机不健康
因此,纯粹出于测试目的(我不会在生产中使用此代码),我决定通过在控制台中执行以下操作来覆盖内置的Date
构造函数:
// create a date object for this Friday:
var d = new Date(2012, 0, 20)
//override Date constructor so all newly constructed dates return this Friday
Date = function(){return d}
考虑到这个假设,我尝试了这个方法,得到了奇怪的结果:
var now = new Date
Sat Apr 07 2012 00:00:00 GMT-0400 (EDT)
now = new Date
Tue Jul 10 2012 00:00:00 GMT-0400 (EDT)
now = new Date
Wed Jul 09 2014 00:00:00 GMT-0400 (EDT)
now = new Date
Wed Jun 07 2023 00:00:00 GMT-0400 (EDT)
……等等
我的问题是,这里到底发生了什么
如果我重写构造函数以返回静态日期,为什么它会给出不相关且不断递增的日期
另外,是否有一种有效的方法可以重写日期构造函数,以便在将来返回静态日期,而无需在代码中执行所有日期实例化调用并修改输出
提前谢谢
编辑:
我在一个新窗口中尝试了我的代码,它按预期工作
罪魁祸首似乎是调用其“刷新”方法的jQueryUIDatePicker插件。当我禁用它的调用时,日期覆盖正常工作,但只要我使用datepicker,就会出现上述奇怪的行为
不知道为什么这个流行的插件会以某种方式影响像这样的全球事物。如果有人有任何想法,请告诉我
对不起,没有早点找出真正的罪犯。试试看
var d = new Date(2012, 0, 20);
// undefine date so that it will only return what your function returns
Date = undefined;
Date = function(){return d;}
修改原型以指向对象应该可以做到这一点
我相信您之前经历的奇怪行为是,Date持有一些时间概念,并且由于原型指向内部时钟,因此您得到的是随机时间。我测试了您的代码:
// create a date object for this Friday:
var d = new Date(2012, 0, 20);
//override Date constructor so all newly constructed dates return this Friday
Date = function(){return d;};
var now = new Date()
console.log(now);
now = new Date()
console.log(now);
now = new Date()
console.log(now);
now = new Date()
console.log(now);
结果呢????为什么如此不同
Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)}
Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)}
Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)}
Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)}
编辑: 我看到无论何时你与日期选取者互动,行为都会有所不同。尝试另一个测试,现在更改
类似于与日期选择器交互:
// create a date object for this Friday:
var d = new Date(2012, 0, 20);
//override Date constructor so all newly constructed dates return this Friday
Date = function(){return d;};
var now = new Date();
var another = new Date();
console.log(now);
another.setDate(13);
now = new Date()
console.log(now);
结果是:
Date {Fri Jan 20 2012 00:00:00 GMT+0700 (SE Asia Standard Time)}
Date {Fri Jan 13 2012 00:00:00 GMT+0700 (SE Asia Standard Time)}
那么,出了什么问题?
您已通过重写核心日期函数
Date = function(){return d;}; // after construction, all date will be d (2012-01-20)
var now = new Date(); // you instantiate a date, but actually now variable is d (2012-01-20)
var another = new Date(); // you instantiate a date, but another is still d (2012-01-20)
another.setDate(13); // change another date to 13 is to change now to 13 (because now and another is still one d)
now = new Date() // still d
console.log(now); // print out now (2012-01-13)
因此,您通过一个函数覆盖核心日期函数,该函数使所有日期使用相同(仅一个)实例,即d(2012-01-20)。更改任何日期都会影响其他人。我也遇到了这个问题,并为此编写了一个模块。也许它对某些人有用: Github:
这对我有用 即如何返回1分钟后的处理时间
Date = class extends Date{
constructor(options) {
if (options) {
super(options);
} else {
super(Date.now() - 1000 * 60);
}
}
};
的答案几乎可以满足我的要求,但这种修改使构造函数在给定参数时像以前一样工作
Date = class extends Date {
constructor(...options) {
if (options.length) {
super(...options);
} else {
super(2019, 2, 11, 19, 19);
}
}
};
我使用以下命令强制UTC日期
var _f = function(item) {
Date.prototype["get" + item] = Date.prototype["getUTC" + item];
Date.prototype["set" + item] = Date.prototype["setUTC" + item];
}
var _d = ['Milliseconds', 'Seconds', 'Minutes', 'Hours', 'Date', 'Month', 'FullYear', 'Year', 'Day'];
_d.forEach(_f);
Date = class extends Date {
constructor(...options) {
if (options.length == 1 && options[0].constructor == Date) {
super(options[0]);
} else if (options.length > 0) {
super(Date.UTC(...options));
} else {
super(Date.UTC());
}
}
};
我无法重现您看到的递增行为。您使用的浏览器/环境是什么?我使用的是OSX 10.7.2上的Chrome 17。我编写了一个库,允许覆盖日期构造函数并设置时区以进行测试:谢谢,请参阅我上面的编辑,了解导致该行为的原因。当我有足够的代表时,我会投票。啊,我明白了。所有新建日期共享同一对象,因此对其中一个日期的修改会影响其他日期。我认为我的解决方案是从构造函数中交付一个克隆对象。谢谢你的帮助!谢谢你的建议,但实际上这不是问题所在。请参阅上面的编辑,了解导致该行为的原因。当我有足够的代表@amchang87:在任何情况下line
Date=undefined时,我都会向上投票代码>你的代码没有任何意义。你是个天才:)它在chrome上正常工作。它不适用于IE11,因为它是ES5。任何想法都允许使用Date.now,以在以后继续工作,任何依赖于特定时间的操作都非常漂亮。如果您正在尝试此解决方案,请注意,仅导入库将更改您的新日期()
结果!仅当您确实想要更改日期时才使用require导入它,或者在您不想调整日期的情况下调用reset()
(例如,如果您有时使用调试环境变量设置日期,我们的用例)。此外,要使用timemachine,还需要添加.parse(),否则其他库很容易损坏。同样:它在铬上正常工作。它不适用于IE11,因为它是ES5。有什么想法吗
var _f = function(item) {
Date.prototype["get" + item] = Date.prototype["getUTC" + item];
Date.prototype["set" + item] = Date.prototype["setUTC" + item];
}
var _d = ['Milliseconds', 'Seconds', 'Minutes', 'Hours', 'Date', 'Month', 'FullYear', 'Year', 'Day'];
_d.forEach(_f);
Date = class extends Date {
constructor(...options) {
if (options.length == 1 && options[0].constructor == Date) {
super(options[0]);
} else if (options.length > 0) {
super(Date.UTC(...options));
} else {
super(Date.UTC());
}
}
};