如何通过JavaScript计算两个日期之间的月和日?

时间:2014-09-27 09:59:45

标签: javascript

我们使用以下代码。

var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds
var firstDate = new Date(2008,01,12);
var secondDate = new Date(2008,01,22);

var diffDays = Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay));

但我们无法在他们之间找到月份和日期。 我想要假设开始日期是27-sep-2014,结束日期是1-nov-2014。结果将是1个月和5天。

2 个答案:

答案 0 :(得分:3)

有多种计算月和日的方法。没有进一步的限制,即使结果可能不同,所有正确的都是正确的。

例如,从9月27日到11月1日可能是

  • 1个月零5天或
  • 4天1个月。

这是一种可能的解决方案。

// swap dates if difference would be negative
if (firstDate.getTime() > secondDate.getTime()) {
    var tmp = firstDate;
    firstDate = secondDate;
    secondDate = tmp;
}

var years = secondDate.getFullYear() - firstDate.getFullYear();
var months = secondDate.getMonth() - firstDate.getMonth();
var days = secondDate.getDate() - firstDate.getDate();

// prevent negative amount of days by breaking up months
for (var i = 0; days < 0; ++i) {
    // while the day difference is negative
    // we break up months into days, starting with the first
    months -= 1;
    days += new Date(
        firstDate.getFullYear(),
        firstDate.getMonth() + 1 + i,
        0, 0, 0, 0, 0
    ).getDate();
}

// prevent negative amount of months by breaking up years
if (months < 0) {
    years += Math.floor(months / 12);
    months = (months % 12 + 12) % 12;
}

// print the result
console.log([
    {amount: days, unit: 'day'},
    {amount: months, unit: 'month'},
    {amount: years, unit: 'year'},
].filter(value => value.amount).map(value =>
    value.amount === 1 ?
        `${value.amount} ${value.unit}` :
        `${value.amount} ${value.unit}s`
).reduce((result, part, index, parts) =>
    index > 0 ? index === parts.length - 1 ?
        `${result} and ${part}` :
        `${result}, ${part}` :
        `${part}`,
        `0 days`
));

示例:

  • 02/12至02/22:10天
  • 09/27至11/01:4天1个月//而不是1个月5天
  • 12/31至03/01:1天2个月//而不是1个月29天
  • 05/31至06/30:30天
  • 01/31至03/30:30天1个月//而不是1个月27天
  • 2010年10月27日至2014年8月26日:30天,9个月和3年

答案 1 :(得分:1)

试试这个

&#13;
&#13;
var oneDay = 24*60*60*1000;
    var firstDate = new Date(2007,01,12);
    var secondDate = new Date(2008,01,22);

    var diffDays = Math.abs((firstDate.getTime() - secondDate.getTime()));

    var result = '',
        years, months, days;
    if((years = diffDays / (365 * oneDay)) > 1){
        result += Math.floor(years) + ' Year(s)';
        diffDays %= (365 * oneDay);
    }
    if((months = diffDays / (30 * oneDay)) > 1){
        result += Math.floor(months) + ' Month(s)';
        diffDays %= (30 * oneDay);
    }
    result += (diffDays / oneDay) + ' Days(s)';
    alert(result);
&#13;
&#13;
&#13;