Javascript 日期:下个月

IT技术 javascript date
2021-03-11 16:09:24

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

我的代码看起来像这样:

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

这段代码每天都在工作,直到今天。这是一个Javascript错误还是我以错误的方式解决这个问题?

6个回答

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

检查一个月中的哪一天,我希望它是 1、2 或 3。如果它与您添加一个月之前不一样,请回滚一天,直到月份再次更改。

这样,“一月的最后一天”就变成了“二月的最后一天”。

编辑:

罗纳德,根据您对其他答案的评论,您可能希望避开边缘情况行为,例如“当我尝试制作 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);
}

这为您提供了下一年 12 月任何一天的 1 月 1 日和任何其他日期的下个月第一天。更多的代码,我知道,但我早就厌倦了提高效率的编码技巧,除非有明确的要求否则我更喜欢可读性。

很好,@Josh :-) - 我的通常不会超过几分钟。我不能为其他人担保。也许我应该将答案调整为“将在您的计算机认为是的月份之后的月份的第一天给您
2021-04-28 16:09:24
当然,值得一提的是,所有这些都取决于您计算机的日期设置。它很少准确。
2021-05-07 16:09:24
太巧了,今天是 2017 年 1 月 31 日!
2021-05-12 16:09:24
此解决方案可能不适用于祖鲁时代。我的增量因时区差异而关闭。
2021-05-13 16:09:24

相反,请尝试:

var now = new Date();
current = new Date(now.getFullYear(), now.getMonth()+1, 1);
我想要做的就是从当月到下个月。我不在乎日子,我只需要准确的月份。
2021-04-22 16:09:24
getYear已弃用,无法正常工作。需要getFullYear改用。
2021-04-25 16:09:24
如果我在使用您的代码后执行 current.getMonth()+1 ,这似乎有效。谢谢!
2021-05-14 16:09:24
请记住,这会将一个月中的第几天设置回 1 - 这是您想要的吗?
2021-05-14 16:09:24

我正在寻找一个简单的单行解决方案来通过数学获得下个月,这样我就不必查找 javascript 日期函数(我的精神懒惰)。很奇怪,我在这里没有找到。

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

解决方案:

(new Date().getMonth()+1)%12 + 1

为了弄清楚为什么会这样,让我分解一下魔法!

它获取当前月份(采用 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

所以你有它。

有史以来最好的解决方案:)
2021-04-29 16:09:24
厉害了,谢谢!如果您需要上个月,请添加 11 而不是 1:(new Date().getMonth()+11)%12 + 1
2021-05-01 16:09:24
不知道为什么,但我用它来到达下个月 (new Date().getMonth()+1)%12 + 23
2021-05-14 16:09:24

您可以使用 date.js 库:

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

就这样做

Date.today().next().month();

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

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

moment().add(7, 'months');

我还根据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))
    }

例子

console.log('Add 3 months to November', addMonths(3, new Date(2017, 10, 27)))

输出 -

Add 3 months to November Thu Feb 01 2018 00:00:00 GMT-0800 (Pacific Standard Time)