在JavaScript中获取年,月,日两个日期之间的差异

时间:2014-10-11 05:36:06

标签: javascript date difference

好吧,我在这里找到了很多类似的问题,试图获得年,月,日两个日期之间的差异......但没有完成我要求的答案。

所以我写了一些东西来计算,它似乎有效,但也许这里的一些专家可以进行更正或帮助使这更简单。

2 个答案:

答案 0 :(得分:5)

您可以使用moment.js来简化此操作:

function difference(d1, d2) {
  var m = moment(d1);
  var years = m.diff(d2, 'years');
  m.add(-years, 'years');
  var months = m.diff(d2, 'months');
  m.add(-months, 'months');
  var days = m.diff(d2, 'days');

  return {years: years, months: months, days: days};
}

例如,

> difference(Date.parse("2014/01/20"), Date.parse("2012/08/17"))
Object {years: 1, months: 5, days: 3}

moment.js还可以返回人类可读的差异("在一年中#34;)如果这是你真正追求的。

答案 1 :(得分:2)

所以这是我的功能,这将收到两个日期,完成所有工作并返回一个包含3个值,年,月和日的json。

var DifFechas = {};

// difference in years, months, and days between 2 dates
DifFechas.AMD = function(dIni, dFin) {
    var dAux, nAnos, nMeses, nDias, cRetorno
    // final date always greater than the initial
    if (dIni > dFin) {
        dAux = dIni
        dIni = dFin
        dFin = dAux
    }
    // calculate years
    nAnos = dFin.getFullYear() - dIni.getFullYear()
    // translate the initial date to the same year that the final
    dAux = new Date(dIni.getFullYear() + nAnos, dIni.getMonth(), dIni.getDate())
    // Check if we have to take a year off because it is not full
    if (dAux > dFin) {
        --nAnos
    }
    // calculate months
    nMeses = dFin.getMonth() - dIni.getMonth()
    // We add in months the part of the incomplete Year
    if (nMeses < 0) {
        nMeses = nMeses + 12
        }
    // Calculate days
    nDias = dFin.getDate() - dIni.getDate()
    // We add in days the part of the incomplete month
    if (nDias < 0) {
        nDias = nDias + this.DiasDelMes(dIni)
    }
    // if the day is greater, we quit the month
    if (dFin.getDate() < dIni.getDate()) {
        if (nMeses == 0) {
            nMeses = 11
        }
        else {
            --nMeses
        }
    }
    cRetorno = {"años":nAnos,"meses":nMeses,"dias":nDias}
    return cRetorno
}

DifFechas.DiasDelMes = function (date) {
    date = new Date(date);
    return 32 - new Date(date.getFullYear(), date.getMonth(), 32).getDate();
}

希望这有助于人们寻找解决方案。

这是其他人所做的新版本,似乎没有错误,希望这更好用