如何在 JavaScript 中为日期添加月份?

IT技术 javascript date
2021-01-14 05:47:25

我想在 JavaScript 中为日期添加月份。

例如:我正在插入日期06/01/2011(格式mm/dd/yyyy),现在我想在这个日期上加上 8 个月。我希望结果是02/01/2012.

所以当增加月份时,年份也可能增加。

4个回答

2019 年 6 月 25 日更正:

var newDate = new Date(date.setMonth(date.getMonth()+8));

这里

var jan312009 = new Date(2009, 0, 31);
var eightMonthsFromJan312009  = jan312009.setMonth(jan312009.getMonth()+8);
@桑普森。不,它将显示 2009 年 3 月 3 日:)
2021-03-18 05:47:25
setMonth() 方法会改变调用它的日期,因此您肯定需要执行以下操作才能不更改 jan312009 var jan312009 = new Date(2009, 0, 31); var8MonthsFromJan312009 = 新日期(jan312009.getTime()); 八个月FromJan312009.setMonth(jan312009.getMonth()+8);
2021-03-21 05:47:25
检查本月最后几天的解决方案;)
2021-03-24 05:47:25
这不是打字错误 - Date 构造函数使用 0 表示一月,而不是 1。
2021-03-30 05:47:25
需要强调的是datenewDate在此代码运行后将包含相同的日期。date此代码修改了IOW
2021-04-08 05:47:25

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

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

日期将负责确定年份。

@KyleMit 取决于您的期望。
2021-03-12 05:47:25
@xehpuk,是的,当然,但这不是大多数人所期望的。如果我添加 1 个月,如果月份是从 10 月到 12 月,我会感到惊讶。 10 + 1 != 12...如果我说的是增加 31 天,当然,那应该是未来的 31 天。无论哪种方式,都适合您的用例,但仍要注意边缘情况
2021-03-28 05:47:25
小心- 这不适用于边缘情况,例如添加到大多数月份的第 31 天。例如,使用此方法的 Oct 31 2011 + 1 个月是使用 Javascript 的标准 Date 对象的 Dec 01 2011。jsfiddle.net/KyleMit/jLbbk27v
2021-04-09 05:47:25

我查看了 datejs 并删除了将月份添加到处理边缘情况(闰年、较短月份等)的日期所需的代码:

Date.isLeapYear = function (year) { 
    return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)); 
};

Date.getDaysInMonth = function (year, month) {
    return [31, (Date.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
};

Date.prototype.isLeapYear = function () { 
    return Date.isLeapYear(this.getFullYear()); 
};

Date.prototype.getDaysInMonth = function () { 
    return Date.getDaysInMonth(this.getFullYear(), this.getMonth());
};

Date.prototype.addMonths = function (value) {
    var n = this.getDate();
    this.setDate(1);
    this.setMonth(this.getMonth() + value);
    this.setDate(Math.min(n, this.getDaysInMonth()));
    return this;
};

这会将“addMonths()”函数添加到任何应该处理边缘情况的 javascript 日期对象。感谢 Coolite Inc!

利用:

var myDate = new Date("01/31/2012");
var result1 = myDate.addMonths(1);

var myDate2 = new Date("01/31/2011");
var result2 = myDate2.addMonths(1);

->> newDate.addMonths -> mydate.addMonths

结果 1 =“2012 年 2 月 29 日”

结果 2 =“2011 年 2 月 28 日”

有趣的丹尼尔,你可以放一个 0 天来得到上个月。
2021-03-29 05:47:25
这个解决方案有一个问题:jsfiddle.net/nikoudel/mdzaddeh假设初始日期是“2011-03-11T00:00:00Z”,本地时区是赫尔辛基(格林威治标准时间+2)。当添加六个月时,由于夏令时而丢失了一个小时:格林威治标准时间 2011 年 9 月 10 日星期六 23:00:00。
2021-03-29 05:47:25
这是考虑例如以下内容的唯一解决方案:Oct 31 2011 + 1 吗?
2021-04-08 05:47:25
恕我直言,更容易找到月份中的天数是 return new Date(year, month+1, 0).getDate(); 因此,对 isLeapYear() 的需求也下降了。也不清楚是否需要非原型方法
2021-04-09 05:47:25
当需要非扩展原型解决方案时,请参阅此响应,如stackoverflow.com/questions/14034180/...
2021-04-10 05:47:25

我强烈建议您查看datejs有了它的 api,添加一个月(以及许多其他日期功能)变得非常简单:

var one_month_from_your_date = your_date_object.add(1).month();

datejs的优点在于它可以处理边缘情况,因为从技术上讲,您可以使用本机Date对象及其附加方法来做到这一点但是你最终会把你的头发从边缘情况拉出来,这datejs已经为你照顾好了。

另外它是开源的!