我一直在为项目使用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.如果它与您添加一个月之前不一样,请回滚一天,直到月份再次变化.
这样,"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); }
这使得您可以在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个月(包括天)的确切值