【发布时间】:2009-10-30 06:59:25
【问题描述】:
如何创建一个 date 对象,它与另一个 date 对象 的月数小于 n 个月?我正在寻找类似DateAdd() 的东西。
示例:
var objCurrentDate = new Date();
现在使用objCurrentDate,如何创建一个日期比今天早六个月的Date 对象/objCurrentDate?
【问题讨论】:
标签: javascript date
如何创建一个 date 对象,它与另一个 date 对象 的月数小于 n 个月?我正在寻找类似DateAdd() 的东西。
示例:
var objCurrentDate = new Date();
现在使用objCurrentDate,如何创建一个日期比今天早六个月的Date 对象/objCurrentDate?
【问题讨论】:
标签: javascript date
你可以很容易地实现一个“addMonths”函数:
function addMonths(date, months) {
date.setMonth(date.getMonth() + months);
return date;
}
addMonths(new Date(), -6); // six months before now
// Thu Apr 30 2009 01:22:46 GMT-0600
addMonths(new Date(), -12); // a year before now
// Thu Oct 30 2008 01:20:22 GMT-0600
编辑: 正如@Brien 所报告的,上述方法存在几个问题。它没有正确处理日期,例如,输入日期中的原始日期高于目标月份中的天数。
我不喜欢的另一件事是该函数正在改变输入的 Date 对象。
这是一个更好的实现,可以处理月末的边缘情况,并且不会对提供的输入日期造成任何副作用:
const getDaysInMonth = (year, month) => new Date(year, month, 0).getDate()
const addMonths = (input, months) => {
const date = new Date(input)
date.setDate(1)
date.setMonth(date.getMonth() + months)
date.setDate(Math.min(input.getDate(), getDaysInMonth(date.getFullYear(), date.getMonth()+1)))
return date
}
console.log(addMonths(new Date('2020-01-31T00:00:00'), -6))
// "2019-07-31T06:00:00.000Z"
console.log(addMonths(new Date('2020-01-31T00:00:00'), 1))
// "2020-02-29T06:00:00.000Z"
console.log(addMonths(new Date('2020-05-31T00:00:00'), -6))
// "2019-11-30T06:00:00.000Z"
console.log(addMonths(new Date('2020-02-29T00:00:00'), -12))
// "2019-02-28T06:00:00.000Z"
【讨论】:
var oldDate:Date = new Date();
/*
Check and adjust the date -
At the least, make sure that the getDate() returns a
valid date for the calculated month and year.
If it's not valid, change the date as per your needs.
You might want to reset it to 1st day of the month/last day of the month
or change the month and set it to 1st day of next month or whatever.
*/
if(oldDate.getMonth() < n)
oldDate.setFullYear(oldDate.getFullYear() - 1);
oldDate.setMonth((oldDate.getMonth() + n) % 12);
【讨论】:
创建日期对象并传递n的值,其中n是月份的数字(加/减)。
var dateObj = new Date();
var requiredDate= dateObj.setMonth(dateObj.getMonth() - n);
【讨论】:
您必须小心,因为日期有很多极端情况。例如,仅仅将月份改回 6 并不能说明每个月的天数不同。例如,如果您运行如下函数:
function addMonths(date, months) {
date.setMonth((date.getMonth() + months) % 12);
return date;
}
addMonths(new Date(2020, 7, 31), -6); //months are 0 based so 7 = August
最终返回日期为 2020 年 2 月 31 日。您需要考虑一个月内天数的差异。其他答案以各种方式提出了这一点,将其移至本月的第一天,或本月的最后一天,或下个月的第一天等。另一种处理方法是保留有效的日期,或者如果它超出了当月的常规日期,则将其移至月末。你可以这样写:
function addMonths(date, months) {
var month = (date.getMonth() + months) % 12;
//create a new Date object that gets the last day of the desired month
var last = new Date(date.getFullYear(), month + 1, 0);
//compare dates and set appropriately
if (date.getDate() <= last.getDate()) {
date.setMonth(month);
}
else {
date.setMonth(month, last.getDate());
}
return date;
}
这至少可以确保所选日期不会“溢出”它被移动到的月份。记录了使用 datePart = 0 方法查找该月的最后一天 here。
这个函数还有很多不足之处,因为它不会增加年数,而且你不能减去超过一年(否则你会遇到一个涉及负数的新问题)。但是,解决这些和您可能遇到的其他问题(即时区)将留给读者作为练习。
【讨论】: