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日.我知道,更多的代码,但我已经厌倦了编写效率的技巧,更喜欢可读性,除非明确要求不这样做.
Bra*_*non 29
相反,尝试:
var now = new Date();
current = new Date(now.getFullYear(), now.getMonth()+1, 1);
Run Code Online (Sandbox Code Playgroud)
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)
所以你有它.
您可以使用date.js库:
http://code.google.com/p/datejs/
就这样做吧
Date.today().next().month();
Run Code Online (Sandbox Code Playgroud)
您将获得今天+ 1个月(包括天)的确切值
如果你使用 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)