我正在寻找一种方法将浏览器的Date
转换为指定的方式,而不会冻结时间。让我假装我有一些函数shiftDate()
就是这样。以下概述了我正在寻找的行为:
// Here's the current time.
new Date().getTime(); //=> 1391109350382
//
// Now let's call the function to shift/travel back in time and _immediately_
// check the time afterwards
shiftDate('2014-01-01');
new Date().getTime(); //=> 1388534400000
//
// Now let's wait 1111 ms and then check the time again
new Date().getTime(); //=> 1388534401111
//
// Let's wait another 1111 ms
new Date().getTime(); //=> 1388534402222
//
// Let's shift/travel back in time once more
shiftDate('2014-01-01');
new Date().getTime(); //=> 1388534400000
//
// Then wait 1111 ms again
new Date().getTime(); //=> 1388534401111
//
// And wait 1111 ms again
new Date().getTime(); //=> 1388534402222
通知时间在每个班次后都会保持滴答声。我发现的大多数解决方案都通过某种模拟或存根完全冻结时间。但是,冻结时间不是一个合适的解决方案:这样做会破坏其他与时间相关的功能,例如动画。下面是一个冻结时间的例子:
new Date().getTime(); //=> 1391109350382
var oldDate = Date;
Date = function() { return new oldDate('2014-01-01'); };
var testDate = new Date();
new Date().getTime(); //=> 1388534400000
// Wait 1111 ms, ten minutes, or an hour: time will never change
new Date().getTime(); //=> 1388534400000
答案 0 :(得分:0)
查看Momentjs以获得方便的日期和时间操作。
答案 1 :(得分:0)
// Let's shift/travel back in time once shiftDate('2014-01-01'); new Date().getTime(); //=> 1388534400000
我不确定你为什么不在自定义的转换逻辑中执行new Date('2014-01-01').getTime();
?
但是,您可以使用以下函数获得所需的行为:
function shiftDate(to) {
var realDate = Date;
Date = function frozenDate() {
Date = realDate;
return new Date(to);
};
}
当您拨打shiftDate
时,下一个 - 也就是下一个 - 调用Date
将会产生一个混乱时间线的日期。
答案 2 :(得分:0)
我不认为有任何方法可以更改日期对象内部时间指针(如果你想调用它)而不深入操作系统。我想你必须编写自己的小库,类似于:
var myDate = function(dateStr){
var initTime = new Date().getTime()
var dateObj = new Date(dateStr);
var myDateTime = dateObj.getTime();
// subtract the init time from the time this method is called
// to get a difference, then add it to your "old" time to get
// the updated millisecond value
this.getTime = function(){
var currentTime = new Date().getTime();
var dif = currentTime - initTime;
return myDateTime + dif;
};
};
您当然可以使用这些方法并实现所有本机Date对象方法。
答案 3 :(得分:0)
我知道了!诀窍是跟踪新Date
原型中的时间变化。这是一个粗略的实现:
function shiftDate(date) {
window.trueDate = window.trueDate || Date;
var trueStart = new trueDate().getTime();
var shiftedStart = new Date(date).getTime();
Date = function() {
var timeChange = new trueDate() - trueStart;
return new trueDate(shiftedStart + timeChange);
}
}
这是一个简单的测试:
shiftDate('2014-01-01')
testDate = new Date();
setInterval(function(){
console.log(new Date().toString());
}, 1000);