我一直在为一个项目使用 Javascript 的日期,但今天注意到我以前工作的代码不再正常工作。下面的代码没有按预期生成二月,而是生成三月。
我的代码看起来像这样:
current = new Date();
current.setMonth(current.getMonth()+1); //If today is Jan, expect it to be Feb now
这段代码每天都在工作,直到今天。这是一个Javascript错误还是我以错误的方式解决这个问题?
我一直在为一个项目使用 Javascript 的日期,但今天注意到我以前工作的代码不再正常工作。下面的代码没有按预期生成二月,而是生成三月。
我的代码看起来像这样:
current = new Date();
current.setMonth(current.getMonth()+1); //If today is Jan, expect it to be Feb now
这段代码每天都在工作,直到今天。这是一个Javascript错误还是我以错误的方式解决这个问题?
您可能会发现您将日期设置为 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 日和任何其他日期的下个月第一天。更多的代码,我知道,但我早就厌倦了提高效率的编码技巧,除非有明确的要求否则我更喜欢可读性。
相反,请尝试:
var now = new Date();
current = new Date(now.getFullYear(), now.getMonth()+1, 1);
我正在寻找一个简单的单行解决方案来通过数学获得下个月,这样我就不必查找 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
所以你有它。
您可以使用 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)