用javascript计算月份的最后一天

如果您在Date.setFullYear中提供了0作为dayValue,那么您将获得上个月的最后一天:

d = new Date(); d.setFullYear(2008, 11, 0); // Sun Nov 30 2008 

在mozilla有这个行为的参考。 这是一个可靠的跨浏览器function,或者我应该看看替代方法?

 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()实现的差异所致,而不是因为date不同。

当然,仅仅因为上面指出的浏览器使用0作为上个月的最后一天并不意味着他们将继续这样做,或者浏览器没有列出将会这样做,但是它可以相信它应该工作同样的方式在每个浏览器。

我将在下个月的第一天使用中间date,并返回前一天的date:

 int_d = new Date(2008, 11+1,1); d = new Date(int_d - 1); 

我觉得这对我来说是最好的解决scheme。 让Date对象为你计算它。

 var today = new Date(); var lastDayOfMonth = new Date(today.getFullYear(), today.getMonth()+1, 0); 

将day参数设置为0意味着比上个月的最后一个月的第一天less一天。

我的同事偶然发现了下面这个可能更简单的解决办法

 function daysInMonth(iMonth, iYear) { return 32 - new Date(iYear, iMonth, 32).getDate(); } 

http://snippets.dzone.com/posts/show/2099盗取;

在计算机方面, new Date()regular expression解决scheme很慢! 如果你想要一个超级快速(和超级神秘)的单线程,试试这个(假设mJan=1格式)。 我不断尝试不同的代码更改以获得最佳性能。

我目前最快的版本:

在查看这个相关的问题闰年检查使用按位运算符(惊人的速度),并发现什么25和15的幻数代表,我想出了这个优化混合的答案:

 function getDaysInMonth(m, y) { return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1); } 

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)几乎所有的浏览器上都比(5546>>m&1)更有效。

对于速度的唯一真正的竞争来自@GitaarLab,所以我创build了一个头对头的JSPerf供我们testing: http ://jsperf.com/days-in-month-head-to-head/5


它的工作原理基于我的闰年答案在这里: javascriptfind闰年这个答案在这里闰年检查使用按位运算符(惊人的速度)以及以下二进制逻辑。

二进制月份的快速教训:

如果你用二进制解释所需月份(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将这些位进行XOR运算,并用& 1来查看结果是1还是0 。 注意:结果+比XOR( ^ )稍快,并且(m >> 3) + m在位0中给出相同的结果。

JSPerf结果 : http : //jsperf.com/days-in-month-perf-test/6

lebreeze提供的解决scheme稍作修改:

 function daysInMonth(iMonth, iYear) { return new Date(iYear, iMonth, 0).getDate(); } 

试试这个。

 lastDateofTheMonth = new Date(year, month, 0) 

例:

 new Date(2012, 8, 0) 

输出:

 Date {Fri Aug 31 2012 00:00:00 GMT+0900 (Tokyo Standard Time)} 

这对我有用。 将提供给定年份和月份的最后一天:

 var d = new Date(2012,02,0); var n = d.getDate(); alert(n); 

这个很好用:

 Date.prototype.setToLastDateInMonth = function () { this.setDate(1); this.setMonth(this.getMonth() + 1); this.setDate(this.getDate() - 1); return this; } 

我认为最好的解决scheme是这样的:

 var date = new Date(); var lastDay = new Date(date.getFullYear(), date.getMonth() + 1); lastDay.setDate(1); lastDay.setHours(-1); lastDay.setHours(23); lastDay.setMinutes(59); lastDay.setSeconds(59); 

对于选定的date,您可以轻松设置特定的date

 var date = new Date('2017-07-04'); //Ymd format. 
 function getLastDay(y, m) { return 30 + (m <= 7 ? ((m % 2) ? 1 : 0) : (!(m % 2) ? 1 : 0)) - (m == 2) - (m == 2 && y % 4 != 0 || !(y % 100 == 0 && y % 400 == 0)); } 

设置月份,你需要约会,然后设置为零,所以月份开始在1 – 31datefunction,然后得到最后一天^^

 var last = new Date(new Date(new Date().setMonth(7)).setDate(0)).getDate(); console.log(last); 

我知道这只是一个语义问题,但我最终以这种forms使用它。

 var lastDay = new Date(new Date(2008, 11+1,1) - 1).getDate(); console.log(lastDay); 

由于函数是从内部参数parsing出来的,所以它的工作原理是一样的。

然后,您可以用所需的详细信息replace年份和月份/年份,无论是从当前date开始。 或者某个特定的月份/年份。

不,不是所有浏览器都会使用0作为最后一天。 IE和Firefox会但Opera不会。

请查看以下来源了解更多信息:

月的最后一天