Javascript Monkeypatch JavasScript日期对象

Javascript Monkeypatch JavasScript日期对象,javascript,datetime,Javascript,Datetime,我知道这是一个疯狂的黑客行为,但无论如何我都很好奇。我们的环境具有错误的系统时间,无法将其设置为正确的时间。这是专门的硬件,所以我们不能改变系统时间。然而,我们确实有一项服务,为我们提供正确的当前时间。我们的问题是,大量ssl和令牌签名库中断,因为它们从javascript日期对象获取了错误的日期时间(因为我们有错误的系统时间) 如何monkeypatch Date对象的构造函数,以便我们可以为其提供正确的初始化时间,以便所有后续对Date()、Date.toString()等的调用。。。在依赖

我知道这是一个疯狂的黑客行为,但无论如何我都很好奇。我们的环境具有错误的系统时间,无法将其设置为正确的时间。这是专门的硬件,所以我们不能改变系统时间。然而,我们确实有一项服务,为我们提供正确的当前时间。我们的问题是,大量ssl和令牌签名库中断,因为它们从javascript日期对象获取了错误的日期时间(因为我们有错误的系统时间)

如何monkeypatch Date对象的构造函数,以便我们可以为其提供正确的初始化时间,以便所有后续对Date()、Date.toString()等的调用。。。在依赖库中,将返回我们的新方法,该方法返回正确的非系统时间

这样行吗

var oldDate = Date;
Date = function(){
    return new oldDate(specialCallToGetCorrectTime()); 
}
Date.prototype = oldDate.prototype;

我刚刚在最新的Chrome、Firefox和IE上试用过,这是允许的。我不认为这比仅仅固定系统时间要好(当然可以固定),但这种方法是可行的。

我刚刚在最新的Chrome、Firefox和IE中试用过,这是允许的。我不认为这比仅仅固定系统时间要好(当然可以固定),但这种方法是可行的。

我刚刚在最新的Chrome、Firefox和IE中试用过,这是允许的。我不认为这比仅仅固定系统时间要好(当然可以固定),但这种方法是可行的。

我刚刚在最新的Chrome、Firefox和IE中试用过,这是允许的。我不认为这比仅仅固定系统时间要好(当然可以固定),但这种方法是可行的。

是的,前提是实现允许您重新定义window.Date


(礼貌的做法是将此类内容封装在一个闭包中)

是的,前提是实现允许您重新定义window.Date


(礼貌的做法是将此类内容封装在一个闭包中)

是的,前提是实现允许您重新定义window.Date


(礼貌的做法是将此类内容封装在一个闭包中)

是的,前提是实现允许您重新定义window.Date

(有礼貌的做法是把这类事情收尾)

这样行吗

var oldDate = Date;
Date = function(){
    return new oldDate(specialCallToGetCorrectTime()); 
}
Date.prototype = oldDate.prototype;
否,因为它不考虑新的
Date
函数的参数,也不考虑它是否作为构造函数调用。您还忘了固定
日期。现在()
。您仍然需要正确处理这些问题:

Date = (function (oldDate, oldnow) {
    function Date(year, month, date, hours, minutes, seconds, ms) {
         var res, l = arguments.length;
         if (l == 0) {
             res = new oldDate(Date.now());
         } else if (l == 1) {
             res = new oldDate(year); // milliseconds since epoch, actually
         } else {
             res = new oldDate(
                 year,
                 month,
                 l > 2 ? date : 1,
                 l > 3 ? hours : 0,
                 l > 4 ? minutes : 0,
                 l > 5 ? seconds : 0,
                 l > 6 ? ms : 0)
         }
         if (this instanceof Date) {
             return res;                 
         } else {
             return res.toString();
         }
    }
    Date.prototype = oldDate.prototype; // required for instanceof checks
    Date.now = function() {
         return oldnow() + offset; // however the system time was wrong
    };
    Date.parse = oldDate.parse;
    Date.UTC = oldDate.UTC;
    return Date;
})(Date, Date.now);
这样行吗

var oldDate = Date;
Date = function(){
    return new oldDate(specialCallToGetCorrectTime()); 
}
Date.prototype = oldDate.prototype;
否,因为它不考虑新的
Date
函数的参数,也不考虑它是否作为构造函数调用。您还忘了固定
日期。现在()
。您仍然需要正确处理这些问题:

Date = (function (oldDate, oldnow) {
    function Date(year, month, date, hours, minutes, seconds, ms) {
         var res, l = arguments.length;
         if (l == 0) {
             res = new oldDate(Date.now());
         } else if (l == 1) {
             res = new oldDate(year); // milliseconds since epoch, actually
         } else {
             res = new oldDate(
                 year,
                 month,
                 l > 2 ? date : 1,
                 l > 3 ? hours : 0,
                 l > 4 ? minutes : 0,
                 l > 5 ? seconds : 0,
                 l > 6 ? ms : 0)
         }
         if (this instanceof Date) {
             return res;                 
         } else {
             return res.toString();
         }
    }
    Date.prototype = oldDate.prototype; // required for instanceof checks
    Date.now = function() {
         return oldnow() + offset; // however the system time was wrong
    };
    Date.parse = oldDate.parse;
    Date.UTC = oldDate.UTC;
    return Date;
})(Date, Date.now);
这样行吗

var oldDate = Date;
Date = function(){
    return new oldDate(specialCallToGetCorrectTime()); 
}
Date.prototype = oldDate.prototype;
否,因为它不考虑新的
Date
函数的参数,也不考虑它是否作为构造函数调用。您还忘了固定
日期。现在()
。您仍然需要正确处理这些问题:

Date = (function (oldDate, oldnow) {
    function Date(year, month, date, hours, minutes, seconds, ms) {
         var res, l = arguments.length;
         if (l == 0) {
             res = new oldDate(Date.now());
         } else if (l == 1) {
             res = new oldDate(year); // milliseconds since epoch, actually
         } else {
             res = new oldDate(
                 year,
                 month,
                 l > 2 ? date : 1,
                 l > 3 ? hours : 0,
                 l > 4 ? minutes : 0,
                 l > 5 ? seconds : 0,
                 l > 6 ? ms : 0)
         }
         if (this instanceof Date) {
             return res;                 
         } else {
             return res.toString();
         }
    }
    Date.prototype = oldDate.prototype; // required for instanceof checks
    Date.now = function() {
         return oldnow() + offset; // however the system time was wrong
    };
    Date.parse = oldDate.parse;
    Date.UTC = oldDate.UTC;
    return Date;
})(Date, Date.now);
这样行吗

var oldDate = Date;
Date = function(){
    return new oldDate(specialCallToGetCorrectTime()); 
}
Date.prototype = oldDate.prototype;
否,因为它不考虑新的
Date
函数的参数,也不考虑它是否作为构造函数调用。您还忘了固定
日期。现在()
。您仍然需要正确处理这些问题:

Date = (function (oldDate, oldnow) {
    function Date(year, month, date, hours, minutes, seconds, ms) {
         var res, l = arguments.length;
         if (l == 0) {
             res = new oldDate(Date.now());
         } else if (l == 1) {
             res = new oldDate(year); // milliseconds since epoch, actually
         } else {
             res = new oldDate(
                 year,
                 month,
                 l > 2 ? date : 1,
                 l > 3 ? hours : 0,
                 l > 4 ? minutes : 0,
                 l > 5 ? seconds : 0,
                 l > 6 ? ms : 0)
         }
         if (this instanceof Date) {
             return res;                 
         } else {
             return res.toString();
         }
    }
    Date.prototype = oldDate.prototype; // required for instanceof checks
    Date.now = function() {
         return oldnow() + offset; // however the system time was wrong
    };
    Date.parse = oldDate.parse;
    Date.UTC = oldDate.UTC;
    return Date;
})(Date, Date.now);

你不能只使用
Date('2014年1月1日')?也许我没有得到正确的要求。你能进一步澄清这个问题吗?你用什么样的“服务”来获得正确的时间?在我看来,花更多的精力来纠正一个荒谬的情况,比如坏的服务器时钟,会更好地利用时间。node.js中有很多库和其他库,它们通过调用new date()来依赖正确的日期。像https和aws库这样需要签名令牌的东西。这些都是由于错误的系统时间而中断的。我不能深入所有的库,找出它们调用Date()的每个实例。我们有一个特殊的呼叫,可以让我们从正在运行的专用硬件上的通道获得正确的时间。。这个硬件还阻止我们将系统时间设置为正确的值。我认为您最好尝试在源代码Node.js中找到系统时间的位置,并添加您需要添加的内容,而不是尝试在javascript中重写日期对象。您不能只使用
Date('1/1/2014')?也许我没有得到正确的要求。你能进一步澄清这个问题吗?你用什么样的“服务”来获得正确的时间?在我看来,花更多的精力来纠正一个荒谬的情况,比如坏的服务器时钟,会更好地利用时间。node.js中有很多库和其他库,它们通过调用new date()来依赖正确的日期。像https和aws库这样需要签名令牌的东西。这些都是由于错误的系统时间而中断的。我不能深入所有的库,找出它们调用Date()的每个实例。我们有一个特殊的呼叫,可以让我们从正在运行的专用硬件上的通道获得正确的时间。。这个硬件还阻止我们将系统时间设置为正确的值。我认为您最好尝试在源代码Node.js中找到系统时间的位置,并添加您需要添加的内容,而不是尝试在javascript中重写日期对象。您不能只使用
Date('1/1/2014')?也许我没有得到正确的要求。你能进一步澄清这个问题吗?你用什么样的“服务”来获得正确的时间?在我看来,花更多的精力来纠正一个荒谬的情况,比如坏的服务器时钟,会更好地利用时间。node.js中有很多库和其他库,它们通过调用new date()来依赖正确的日期。像https和aws库这样需要签名令牌的东西。这些都是由于错误的系统时间而中断的。我不能深入所有的库,找出它们调用Date()的每个实例。我们有一个特别的电话,让我们