javascript将分钟添加到新日期();在使用对象之前

javascript add minutes to new Date(); before using the object

本文关键字:对象 日期 分钟 添加 新日期 javascript      更新时间:2023-09-26

我有一个函数调用,它启动了一堆计时器,我想在每个计时器上增加几分钟,这样它们就不会全部从零开始。我在以下方面取得了成功:

var currentDate = new Date();
var twentyMinutesLater = new Date(currentDate.getTime() + (20 * 60 * 1000));
new CountUp(twentyMinutesLater, 'counter03');

我很想跳过为所有我想要的计时器创建var twentyMinutesLater等等,我只是无法正确地获取语法,或者这是不可能的。有没有办法在下面的函数调用中添加毫秒。

new CountUp(new Date(), 'counter03');

我试过:

new CountUp((new Date() + (20 * 60 * 1000)), 'counter03');

结果NaN-NaN:NaN:NaN,所以它不是一个数字带双引号的结果相同。

有没有javascript语法大师有什么想法?

在您的特定代码中,您将Date对象传递给计数器代码,但这不是预期的。它期望一个时间值,从中它将创建自己的Date对象(您可以在Counter函数的构造函数中看到这一点)。此外,计数器代码不会在未来花费时间,只会在过去花费时间(也许是因为它不想处理负面时间——我不知道)。

这里有一个工作示例,我修改了在回答其他问题时使用的另一个jsFiddle。

function addCounter() {
    var currentDate = new Date();
    var twentyMinutesLater = currentDate.getTime() - (20 * 60 * 1000);
    var div = document.createElement("div");
    div.id = "counter" + counterNum++;
    document.body.appendChild(div);
    new CountUp(twentyMinutesLater, div.id);
}

这里有一个jsFiddle,它可以让你输入分钟数,它会以这个值启动一个计数器:http://jsfiddle.net/jfriend00/vnf5z/.

应该执行以下操作:

var d = new Date();
new CountUp(d.setMinutes(d.getMinutes() + 20), 'counter03'); 

根据CountUp构造函数如何使用传递给它的日期对象,以及是否要重用d,您可能需要:

var d = new Date();
new CountUp(new Date(d.setMinutes(d.getMinutes() + 20)), 'counter03'); 

以便每次调用CountUp都会得到一个不同的日期对象。

这只是我在Rails中看到的另一种方法。您可以使用以下语法创建相对日期对象,

(20).minutes().fromNow()

或者,如果你讨厌括号里的噪音,你可以这样做(只在ES5兼容的浏览器上),

(20).minutes.fromNow

这是第一个在Number原型上添加方法的非ES5解决方案。

Number.prototype.minutes = function() {
    // minutes to milliseconds
    return this * 60 * 1000;
};
Number.prototype.fromNow = function() {
    var futureDate = new Date(Date.now() + this);
    return futureDate;
};

new CountUp((20).minutes().fromNow(), 'foo')

以下是添加了函数支持属性的ES5解决方案。

Object.defineProperties(Number.prototype, {
    minutes: {
        get: function() {
            // minutes to milliseconds
            return this * 60 * 1000;
        }
    },
    fromNow: {
        get: function() {
            var futureDate = new Date(Date.now() + this);
            return futureDate;
        }
    }
});

new CountUp((20).minutes.fromNow, 'foo')

关于原生客体的外延,有不同的学派。一个团体不惜一切代价禁止使用它,而另一个团体则鼓励几乎在任何地方使用它。与任何事情一样,保持平衡很重要。

new Date()确实返回了一个对象,而不是时间戳,所以你不应该在那里使用数学运算(当你期望得到一个数字时,至少不要相加)。使用Date.getTime():

//when you need a Date-object as argument
  new CountUp(new Date(new Date().getTime() + (20 * 60 * 1000)) , 'counter03');
//when you need the timestamp as argument
  new CountUp((new Date().getTime() + (20 * 60 * 1000)) , 'counter03');

看小提琴来识别区别:http://jsfiddle.net/doktormolle/8v4Tx/