如果您提供0
的dayValue
在Date.setFullYear
你上一个月的最后一天:
d = new Date(); d.setFullYear(2008, 11, 0); // Sun Nov 30 2008
在mozilla 上参考了这种行为。这是一个可靠的跨浏览器功能还是我应该查看替代方法?
如果您提供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);
console.log(d.toString()); // 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 作为上个月的最后一天并不意味着它们会继续这样做,或者没有列出的浏览器会这样做,但它为相信它应该工作的信念提供了可信度在每个浏览器中以相同的方式。
我发现这对我来说是最好的解决方案。让 Date 对象为您计算。
var today = new Date();
var lastDayOfMonth = new Date(today.getFullYear(), today.getMonth()+1, 0);
将 day 参数设置为 0 表示比上个月的最后一天的月份的第一天少一天。
我将使用下个月第一天的中间日期,并返回前一天的日期:
int_d = new Date(2008, 11+1,1);
d = new Date(int_d - 1);
在计算机术语中,new Date()
和regular expression
解决方案是慢!如果你想要一个超快(和超神秘)的单线,试试这个(假设m
是Jan=1
格式)。我不断尝试不同的代码更改以获得最佳性能。
我目前最快的版本:
在查看了这个相关问题Leap year check using bitwise operators(惊人的速度)并发现 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 to findleap year this answer here Leap year check using bitwise operators(惊人的速度)以及以下二进制逻辑。
二进制月份的快速课程:
如果您以二进制形式解释所需月份 (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个地方转移value>> 3
,XOR位与原^ 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();
}