Javascript日期:下个月

36 javascript date

我一直在为项目使用Javascript的日期,但今天注意到我之前工作的代码不再正常工作.下面的代码不是按预期产生二月,而是产生三月.

我的代码看起来像这样:

current = new Date();
current.setMonth(current.getMonth()+1); //If today is Jan, expect it to be Feb now
Run Code Online (Sandbox Code Playgroud)

这段代码每天工作到今天.这是一个Javascript错误还是我错误的方式?

pax*_*blo 52

您可能会发现您将日期设置为2009年2月31日(如果今天是1月31日)并且Javascript会自动将其设置为3月初.

检查当月的日期,我希望它是1,2或3.如果它与您添加一个月之前不一样,请回滚一天,直到月份再次变化.

这样,"1月的最后一天"成为"2月的最后一天".

编辑:

罗纳德,基于你对其他答案的评论,你可能想要避开边缘案例行为,例如"当我试图制作2月30日时会发生什么"或"当我试图制作2009/13/07时会发生什么"(yyyy)/mm/dd)"(即使我的解决方案,最后一个可能仍然是一个问题,所以你应该测试它).

相反,我会明确地编写可能性的代码.因为你不关心这个月的某一天(你只想让下个月的年份和月份正确),所以这样的事情应该足够了:

var now = new Date();
if (now.getMonth() == 11) {
    var current = new Date(now.getFullYear() + 1, 0, 1);
} else {
    var current = new Date(now.getFullYear(), now.getMonth() + 1, 1);
}
Run Code Online (Sandbox Code Playgroud)

这使得您可以在12月的任何一天和次月的第一天为其他任何一天的1月1日.我知道,更多的代码,但我已经厌倦了编写效率的技巧,更喜欢可读性,除非明确要求不这样做.

  • 太巧了,今天是2017年1月31日! (2认同)

Bra*_*non 29

相反,尝试:

var now = new Date();
current = new Date(now.getFullYear(), now.getMonth()+1, 1);
Run Code Online (Sandbox Code Playgroud)

  • `getYear`已弃用,无法正常运行.需要使用`getFullYear`代替. (9认同)
  • 如果月份是 12 月,这将如何运作?编辑:通过滚动到下一年来验证它是否有效。 (2认同)

Ter*_*ley 18

我正在寻找一个简单的单行解决方案,以通过数学获得下个月,所以我不必查找javascript日期函数(我的心理懒惰).很奇怪,我在这里找不到一个.

我克服了短暂的懒惰,写了一篇,并决定分享!

解:

(new Date().getMonth()+1)%12 + 1
Run Code Online (Sandbox Code Playgroud)

只是要清楚为什么这个有用,让我打破魔法吧!

它获得当前月份(以0..11格式),下个月递增1,并将其包裹到12通过模数的边界(11%12 == 11; 12%12 == 0).这将以相同的0..11格式返回下个月,因此转换为格式Date()将识别(1..12)很简单:只需再次添加1即可.

概念证明:

> for(var m=0;m<=11;m++) { console.info( "next month for %i: %i", m+1, (m+1)%12 + 1 ) }
next month for 1: 2
next month for 2: 3
next month for 3: 4
next month for 4: 5
next month for 5: 6
next month for 6: 7
next month for 7: 8
next month for 8: 9
next month for 9: 10
next month for 10: 11
next month for 11: 12
next month for 12: 1
Run Code Online (Sandbox Code Playgroud)

所以你有它.


Jul*_*lio 6

您可以使用date.js库:

http://code.google.com/p/datejs/

就这样做吧

Date.today().next().month();
Run Code Online (Sandbox Code Playgroud)

您将获得今天+ 1个月(包括天)的确切值


Rad*_*tam 6

如果你使用 moment.js,它们有一个 add 函数。这是链接 - https://momentjs.com/docs/#/manipulated/add/

moment().add(7, 'months');
Run Code Online (Sandbox Code Playgroud)

我还根据 paxdiablo 的答案编写了一个递归函数来添加可变的月份数。默认情况下,此函数会在当前日期上添加一个月。

function addMonths(after = 1, now = new Date()) {
        var current;
        if (now.getMonth() == 11) {
            current = new Date(now.getFullYear() + 1, 0, 1);
        } else {
            current = new Date(now.getFullYear(), now.getMonth() + 1, 1);            
        }
        return (after == 1) ? current : addMonths(after - 1, new Date(now.getFullYear(), now.getMonth() + 1, 1))
    }
Run Code Online (Sandbox Code Playgroud)

例子

console.log('Add 3 months to November', addMonths(3, new Date(2017, 10, 27)))
Run Code Online (Sandbox Code Playgroud)

输出 -

Add 3 months to November Thu Feb 01 2018 00:00:00 GMT-0800 (Pacific Standard Time)
Run Code Online (Sandbox Code Playgroud)