如果您提供0
的dayValue
在Date.setFullYear
你上一个月的最后一天:
d = new Date(); d.setFullYear(2008, 11, 0); // Sun Nov 30 2008
在mozilla中提到了这种行为.这是一个可靠的跨浏览器功能还是我应该考虑其他方法?
var month = 0; // January var d = new Date(2008, month + 1, 0); alert(d); // last day in January IE 6: Thu Jan 31 00:00:00 CST 2008 IE 7: Thu Jan 31 00:00:00 CST 2008 IE 8: Beta 2: Thu Jan 31 00:00:00 CST 2008 Opera 8.54: Thu, 31 Jan 2008 00:00:00 GMT-0600 Opera 9.27: Thu, 31 Jan 2008 00:00:00 GMT-0600 Opera 9.60: Thu Jan 31 2008 00:00:00 GMT-0600 Firefox 2.0.0.17: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time) Firefox 3.0.3: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time) Google Chrome 0.2.149.30: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time) Safari for Windows 3.1.2: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
产出差异是由于实施的差异toString()
,而不是因为日期不同.
当然,仅仅因为上面提到的浏览器使用0作为上个月的最后一天并不意味着他们将继续这样做,或者未列出的浏览器会这样做,但它使人们相信它应该工作的可信度每个浏览器都一样.
我会在下个月的第一天使用中间日期,并返回前一天的日期:
int_d = new Date(2008, 11+1,1); d = new Date(int_d - 1);
我觉得这对我来说是最好的解决方案.让Date对象为您计算它.
var today = new Date(); var lastDayOfMonth = new Date(today.getFullYear(), today.getMonth()+1, 0);
将day参数设置为0表示比上个月的最后一天月份的第一天少一天.
在计算机术语中,new Date()
和regular expression
解决方案是慢!如果你想要一个超快(超级神秘)的单行,请试试这个(假设m
是Jan=1
格式).我一直在尝试不同的代码更改以获得最佳性能.
我目前最快的版本:
在查看这个相关问题闰年检查使用按位运算符(惊人的速度)并发现25和15幻数代表什么,我已经提出了这种优化的答案混合:
function getDaysInMonth(m, y) { return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1); }
鉴于位移,这显然假设你的m
&y
参数都是整数,因为将数字作为字符串传递将导致奇怪的结果.
JSFiddle: http ://jsfiddle.net/TrueBlueAussie/H89X3/22/
JSPerf结果: http ://jsperf.com/days-in-month-head-to-head/5
出于某种原因,(m+(m>>3)&1)
是不是更有效(5546>>m&1)
上几乎所有的浏览器.
唯一真正的速度竞争来自@GitaarLab,所以我创建了一个头对头的JSPerf供我们测试:http://jsperf.com/days-in-month-head-to-head/5
它基于我的闰年答案在这里工作:javascript找到闰年这个答案在这里闰年检查使用按位运算符(惊人的速度)以及以下二进制逻辑.
二进制月的快速教训:
如果您以二进制形式解释所需月份(Jan = 1)的索引,您会注意到31天的月份有3位清除和位0设置,或位3设置和位0清除.
Jan = 1 = 0001 : 31 days Feb = 2 = 0010 Mar = 3 = 0011 : 31 days Apr = 4 = 0100 May = 5 = 0101 : 31 days Jun = 6 = 0110 Jul = 7 = 0111 : 31 days Aug = 8 = 1000 : 31 days Sep = 9 = 1001 Oct = 10 = 1010 : 31 days Nov = 11 = 1011 Dec = 12 = 1100 : 31 days
这意味着您可以将值移位3个位置>> 3
,将位与原始位置进行异或,^ m
并查看结果是否在位1
或0
0位置使用& 1
.注意:事实证明它+
比XOR(^
)略快,并且(m >> 3) + m
在第0位给出相同的结果.
JSPerf结果:http://jsperf.com/days-in-month-perf-test/6
我的同事偶然发现了以下问题,这可能是一个更容易的解决方案
function daysInMonth(iMonth, iYear) { return 32 - new Date(iYear, iMonth, 32).getDate(); }
从http://snippets.dzone.com/posts/show/2099偷来的
对lebreeze提供的解决方案略有修改:
function daysInMonth(iMonth, iYear) { return new Date(iYear, iMonth, 0).getDate(); }