在Javascript中移动(不冻结)日期/时间

时间:2014-01-30 17:31:47

标签: javascript date datetime

我正在寻找一种方法将浏览器的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

4 个答案:

答案 0 :(得分:0)

查看Momentjs以获得方便的日期和时间操作。

http://momentjs.com/

答案 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);