从JavaScript中计算最终截止日期

时间:2015-04-13 23:24:40

标签: javascript date math

我需要找到一种方法来计算使用JavaScript的贷款的最终到期日期,但需要在不到31天或30天的时间内计算月数。

例如,如果我的期限为60个月(5年)且我的start_date为2015年1月31日,则我的最终截止日期为12/31/2019。现在,如果我的任期是62个月,我的最后截止日期是02/28/2020。大多数JavaScript数学的问题是我得到了03/03/2020的结果,这是不正确的。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

这没有经过充分测试,但它可能会做你想要的。它涉及重做Date API自动执行的一些计算,但它们并不太难:

var addMonths = (function() {
  var counts = {
    normal: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
    leap:   [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  };
  return function(startDate, months) {
    var endYear = startDate.getFullYear() + Math.ceil((months + startDate.getMonth()) / 12) - 1;
    var yearType = ((endYear % 4 == 0) && (endYear % 100 != 0)) || (endYear % 400 == 0) ? 'leap' : 'normal';
    var endMonth = (startDate.getMonth() + months) % 12;
    var endDate = Math.min(startDate.getDate(), counts[yearType][endMonth]);
    return new Date(endYear, endMonth, endDate);
  };
}());

var date = new Date(2015, 0, 31); // 2015-01-31
addMonths(date, 60); //=> 2020-01-31
addMonths(date, 61); //=> 2020-02-29
addMonths(date, 62); //=> 2020-03-31
addMonths(date, 63); //=> 2020-04-30
addMonths(date, 73); //=> 2021-02-28

请注意,我的电话号码似乎与您的号码相隔一个月。我猜你在使用第一笔付款作为开始日期,并没有实际添加完整的补充,比如62个月。但显然如果你愿意的话,这很容易通过一个调整。

答案 1 :(得分:0)

添加您想要的年数和月数,然后找到该月的最后一天。 Javascript日期添加将为您提供您找到的结果,因此需要几个额外的步骤:

function addMonths(month, year, term) {
    var endTerm = term - 1;     // adjust for zero index
    var newYear = year + parseInt(endTerm / 12); // add the years
    var newMonth = month + (endTerm % 12);  // add the remaining months
    if (newMonth > 12)  {     // remaining months into next year?
        newYear = newYear + 1;  
        newMonth = newMonth - 12;
    }
    var endDate = new Date(newYear, newMonth, 0); // get last day of month
    return endDate;
}

此解决方案符合您设置的参数。您需要检查角落情况。例如,1个月的期限给出当月的结束日期,2个月的期限给出下个月的结束日期。

对于您的具体问题,这是一个非常简单的解决方案。如果您要进行一系列日期操作,请考虑使用库。

这是一个真正的快速jsFiddle:https://jsfiddle.net/8gnb0s0s/3/