用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(); }
在计算机方面, new Date()
和regular expression
解决scheme很慢! 如果你想要一个超级快速(和超级神秘)的单线程,试试这个(假设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); }
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不会。
请查看以下来源了解更多信息:
月的最后一天