如何使用JS中的getTime()函数正确计算两个日期之间的剩余时间?

9

我正在尝试使用以下函数在JS中计算剩余时间(例如:从今天(2014/03/02)起10年2个月零10天):

var d2 = new Date(2024, 3, 12);
var d1 = new Date();
var d0 = new Date(1970, 0, 1);

var diff = new Date(d2.getTime() - (d1.getTime() + d0.getTime() ) );
var years = diff.getFullYear();
var months = diff.getMonth();
var days = diff.getDay();

alert("remaining time = " + years + " years, " + months + " months, " + days + " days.");

但是,我得到的不是10年的差异,而是1980年的差异(尽管我理解天数的差异是由月份和年份的变化产生的):

enter image description here

是否可能使用这种策略执行“剩余时间”操作?如果是这样,如何获得预期的结果?

这里是在JS shell中的函数:jsfiddle.net/3ra6c/


一旦你得到了两个日期之间的毫秒差异,你需要进行一些数学计算来确定这个毫秒数代表多少年、天、分钟等。除非考虑闰年和秒的影响(这会变得复杂),否则你可能会做出近似值。将其计算为天数将是diff / (24 * 60 * 60 *100)。一天大约有86400000毫秒。依此类推。 - Xotic750
在StackOverflow上有很多答案,可以试着搜索类似于http://stackoverflow.com/search?q=milliseconds+to+days的内容。另外你可以使用一些库来实现这个功能,例如[`moments.js`](http://momentjs.com/),它可以进行这样的逼近计算。 - Xotic750
谢谢,@Xotic750,我已经搜索了这些问题。我只是想知道为什么通过日期操作来进行这个操作不起作用。无论如何,我找到的唯一类似于我所需的答案是在GAS中使用moment.js库。但它在我的脚本中没有起作用。 - craftApprentice
基本上,Date 对象没有配备这些类型的函数。 - Xotic750
你能把它作为答案吗? - craftApprentice
我会尝试用“moments”给你举个例子,但是这里已经有很多答案在SO上描述了数学。 - Xotic750
3个回答

6

我在这里找到了我需要的解决方案:

var date1 = new Date();
var date2 = new Date(2015, 2, 2);
var diff = new Date(date2.getTime() - date1.getTime());

var years = diff.getUTCFullYear() - 1970; // Gives difference as year
var months = diff.getUTCMonth(); // Gives month count of difference
var days = diff.getUTCDate()-1; // Gives day count of difference

alert("remaining time = " + years + " years, " + months + " months, " + days + " days.");

看起来它的运行非常顺畅!


1
这也会给你一些近似值。尝试日期 2014-1-12014-1-31,然后尝试 2014-1-12014-2-1。不是你期望的结果?只要你知道就好了。 ;) 当像这样时也要小心,尝试 2014-1-12013-12-31 - Xotic750

5
正如我已经解释的那样,Date 没有这样的功能,你需要自己进行计算。你可以获得两个日期之间的毫秒差异,然后就是根据你的需求进行计算。
下面是使用 moment.js 的示例,它与 require.js 一起加载,并使用了人性化的近似值。
Javascript
require.config({
    paths: {
        moment: 'http://momentjs.com/downloads/moment.min'
    }
});

require(['moment'], function (moment) {
    var x = moment(new Date(2024, 3, 12)).from(new Date());

    console.log(x);
});

输出

in 10 years

jsFiddle上,查看文档以了解如何使输出更加通俗易懂,您可能需要更多细节。

1

var diff = new Date(d2.getTime() - (d1.getTime() + d0.getTime()));

为什么要加上d0?尝试将其移除。


实际上有没有 d0 结果是一样的(1980年)。 - craftApprentice
如上所述,尝试进行一些数学计算/1000以获取秒数。然后将其除以3600并向下取整结果。然后获取您的总秒数减去以秒为单位的小时数。现在对于分钟也是同样的操作。始终从最高部分开始。因此,如果您想要以天,小时和秒为单位,则需要首先计算整个天数。然后计算整个小时等等。 - Martin Diphoorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接