在 JavaScript 中向日期添加月份

IT技术 php javascript
2021-02-06 09:49:38

可能的重复:
将 X 个月添加到日期的 Javascript 函数

我想为用户输入的结束日期添加 2 个月。如何将 2 个月添加到结束日期并显示它?

/**
* Click "Cal" on end date
*/
function getEndDate() {
if(!document.getElementById('startdate').value.length) {
    alert("Start date must be set first.");
}
else {
    prevEndDate = document.getElementById('enddate').value;
    displayCalendar(document.forms[0].enddate,'yyyy/mm/dd',
        document.getElementById('enddatebutton'));
}
}

/**
* Click "Cal" on expiry date
*/
function getExpiryDate() {
if(!document.getElementById('enddate').value.length) {
    alert("End date must be set first.");
}
else {
    prevExpiryDate = document.getElementById('expirydate').value;
    displayCalendar(document.forms[0].expirydate,'yyyy/mm/dd',
        document.getElementById('expirydatebutton'));
 }
}

任何帮助表示赞赏。谢谢!

2个回答

您需要获取添加月份的业务规则。简单的解决方法是:

function addMonths(dateObj, num) {
  return dateObj.setMonth(dateObj.getMonth() + num);
}

但是,这会将 7 月 31 日更改为 9 月 31 日,后者将转换为 10 月 1 日。此外,1 月 31 日加 1 个月是 2 月 31 日,这将根据是否为闰年转换为 2 月或 3 日。

您可能期望第一个是 9 月 30 日,第二个是 2 月 28 日或 29 日(取决于它是否是闰年)。

因此,如果您想观察“月末”,则需要执行以下操作:

function addMonths(dateObj, num) {

    var currentMonth = dateObj.getMonth() + dateObj.getFullYear() * 12;
    dateObj.setMonth(dateObj.getMonth() + num);
    var diff = dateObj.getMonth() + dateObj.getFullYear() * 12 - currentMonth;

    // If don't get the right number, set date to 
    // last day of previous month
    if (diff != num) {
        dateObj.setDate(0);
    } 
    return dateObj;
} 

但是请与负责他们想要的业务规则的人联系。

编辑

上面的方法效果很好,但为了回应 McShaman 的评论,这里有一个版本,对月份滚动进行了更简单的检查:

function addMonths(date, months) {
  var d = date.getDate();
  date.setMonth(date.getMonth() + +months);
  if (date.getDate() != d) {
    date.setDate(0);
  }
  return date;
}

// Add 12 months to 29 Feb 2016 -> 28 Feb 2017
console.log(addMonths(new Date(2016,1,29),12).toString());

// Subtract 1 month from 1 Jan 2017 -> 1 Dec 2016
console.log(addMonths(new Date(2017,0,1),-1).toString());

// Subtract 2 months from 31 Jan 2017 -> 30 Nov 2016
console.log(addMonths(new Date(2017,0,31),-2).toString());

// Add 2 months to 31 Dec 2016 -> 28 Feb 2017
console.log(addMonths(new Date(2016,11,31),2).toString());

@JanŠotola 你的意思是201612 月 1 日是预期的吗?
2021-03-18 09:49:38
@linuxNoob——在这种情况下,它充当一元 + 运算符并将操作数转换为数字(实际上是一种速记方式Number(months))。
2021-03-18 09:49:38
@JanŠotola-谢谢,已修复。以前的算法仅在添加月份时有效。
2021-03-28 09:49:38
@McShaman-是的,它将所需的月数添加到日期中,就好了。
2021-04-08 09:49:38
这行得通吗?如果是这样……怎么样?什么是d.getMonth() + d.getFullYear() * 12工作了的代码?
2021-04-11 09:49:38

将您的日期拆分为年、月和日组件,然后使用Date

var d = new Date(year, month, day);
d.setMonth(d.getMonth() + 8);

日期将负责确定年份。

如何在 JavaScript 中向日期添加月份的可能重复

谢谢你把 RobG 说清楚,我很感激
2021-04-01 09:49:38
月份需要是--month因为它们在 javascript 中的索引为零。此外,如果您使用上述方法将 2 个月添加到 7 月 31 日,您将得到 9 月 31 日,由于 9 月只有 30 天,因此转换为 10 月 1 日。
2021-04-12 09:49:38