javascript - 重写 Javascript Date 构造函数?

标签 javascript date

我正在开发一个对当前日期敏感的浏览器应用程序。

在我的应用程序代码中,我调用了 new Date 并根据当前时间执行计算并相应地呈现 View 。

为了针对不同的潜在日历日测试我的应用程序,我将不得不不断地将我的系统时钟更改为过去或 future ,这很烦人而且可能对我的计算机不健康。

因此纯粹出于测试目的(我永远不会在生产中使用此代码),我决定通过在控制台中执行此操作来覆盖内置的 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)

……等等……

我的问题是,这里到底发生了什么?

如果我覆盖构造函数以返回静态日期,为什么它给出不相关且不断递增的日期?

此外,是否有一种有效的方法可以覆盖 Date 构造函数以在将来返回静态日期,而无需在我的代码中完成所有日期实例化调用并修改输出?

提前致谢。

编辑:

我在一个新窗口中尝试了我的代码,它按预期工作。

罪魁祸首似乎是调用其“刷新”方法的 jQuery UI 日期选择器插件。当我禁用它的调用时,日期覆盖正常工作,但是一旦我使用日期选择器,就会发生上述奇怪的行为。

不知道为什么这个流行的插件会以某种方式影响像这样的全局。如果有人有任何想法,请告诉我。

很抱歉没有早点找出真正的罪魁祸首。

最佳答案

我也遇到过这个问题并最终为此编写了一个模块。也许它对某人有用:

Github: https://github.com/schickling/timemachine

timemachine.config({
  dateString: 'December 25, 1991 13:12:59'
});

console.log(new Date()); // December 25, 1991 13:12:59

关于javascript - 重写 Javascript Date 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8922145/

相关文章:

javascript - 为不同的环境构建 Electron

javascript - 从 JavaScript 数组递归构建 JSON

macos - 在 Mac OS X shell 脚本中从开始日期循环到结束日期

javascript - 在javascript中,如何获取new Date(2017,05,31).toISOString()的UTC格式的时区值?

javascript - 如何在 JavaScript 中运行系统命令?

javascript - jQuery/JS setTimeout/clearTimeout

java - Ajax 调用不起作用

java - 日期验证,包括相应月份的天数

javascript - 添加 30 天日期 (mm/dd/yyyy) 然后返回字符串 (mm/dd/yyyy)

javascript - 一天中几秒的新 JavaScript 日期对象