【问题标题】:How to add months to a date in JavaScript? [duplicate]如何在 JavaScript 中为日期添加月份? [复制]
【发布时间】:2011-08-04 10:36:44
【问题描述】:

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

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

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

【问题讨论】:

  • 如果,你把 06/01/2011 的日期加上 8 个月,它会变成 02/01/2011,请你把它说清楚
  • 这是一个很难解决的问题 - 如果您在一个月的 31 日并且目标月份没有 31 天会发生什么?更糟糕的是,如果目标月份是 2 月呢?
  • @kalyan :如果我在 06/01/2011(mm/dd/yyyy) 日期加上 8 个月,那么它将是 02/01/2012 因为如果我们添加 06+08 = 14 和我们只有 12 个月,所以它会改变年份并给出结果为 02/01/2012。
  • @Alnitak :不,亲爱的,它只会从每月的第一个日期开始。
  • 那你应该这么说......

标签: javascript date


【解决方案1】:

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

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

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

另外它是开源的!

【讨论】:

    【解决方案2】:

    自 2019 年 6 月 25 日起更正:

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

    来自here

    var jan312009 = new Date(2009, 0, 31);
    var eightMonthsFromJan312009  = jan312009.setMonth(jan312009.getMonth()+8);
    

    【讨论】:

    • 这不是错字 - Date 构造函数使用 0 表示一月,而不是 1。
    • @Sampson。不,它将显示 2009 年 3 月 3 日 :)
    • 检查本月最后几天的解决方案 ;)
    • setMonth() 方法会改变它被调用的日期,因此您肯定需要执行以下操作才能不更改 jan312009 var jan312009 = new Date(2009, 0, 31);变量八个月从一月312009 =新日期(jan312009.getTime()); EightMonthsFromJan312009.setMonth(jan312009.getMonth()+8);
    • 重要的是要强调datenewDate 在此代码运行后将包含相同的日期。 IOW date 被此代码修改。
    【解决方案3】:

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

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

    日期将负责确定年份。

    【讨论】:

    • 小心 - 这不适用于边缘情况,例如添加到大多数月份的第 31 天。例如,2011 年 10 月 31 日 + 1 个月使用此方法是 2011 年 12 月 1 日,使用 Javascript 的标准日期对象。 jsfiddle.net/KyleMit/jLbbk27v
    • @KyleMit 取决于你的期望。
    • @xehpuk,是的,当然,但这不是大多数人所期望的。如果我加上 1 个月,如果这个月从 10 月到 12 月,我会感到惊讶。 10 + 1 != 12 ...如果我说的是增加 31 天,那么可以肯定,那应该只是未来的 31 天。无论哪种方式,都适合您的用例,但仍要注意边缘情况
    【解决方案4】:

    我查看了 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 日”

    result2 = "2011 年 2 月 28 日"

    【讨论】:

    • 这是唯一考虑例如:Oct 31 2011 + 1 的解决方案吗?
    • 更容易恕我直言查找月份中的日期是 return new Date(year, month+1, 0).getDate();所以也需要 isLeapYear() 下降。也不清楚是否需要非原型方法
    • 有趣的大牛,你可以放一个0天来获取上个月。
    • 此解决方案存在问题:jsfiddle.net/nikoudel/mdzaddeh 假设初始日期为“2011-03-11T00:00:00Z”,本地时区为赫尔辛基 (GMT+2)。添加六个月后,由于夏令时,一个小时会丢失:2011 年 9 月 10 日星期六 23:00:00 GMT。
    • 当需要非扩展原型解决方案时,请参阅this response,如stackoverflow.com/questions/14034180/… 中所述
    猜你喜欢
    • 2012-09-29
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    相关资源
    最近更新 更多