【算法思想】
获取下个月第一天(new Date(year, month + 1, 1))再倒退一天即可。
【优点】
1. 不需要再计算某月含有多少天,虽然可以很简单解决吗,用数组[31,28/29,31,30,31,30,31,31,30,31,30,31];
2. 不需要计算2月是否是闰月。
【代码】
/** * @author Xing,XiuDong * @date 2010.03.20 * @param year: 建议从0开始,0表示1900年 * @param month: 从0开始,0表示1月 */ function getLastDateOfMonth(year, month) { return new Date(new Date(year, month + 1, 1).getTime() – 1000 * 60 * 60 * 24); }
【测试代码】
<mce:script type=”text/javascript”><!– /** * @author Xing,XiuDong * @date 2010.03.20 * @param year: 建议从0开始,0表示1900年 * @param month: 从0开始,0表示1月 */ function getLastDateOfMonth(year, month) { return new Date(new Date(year, month + 1, 1).getTime() – 1000 * 60 * 60 * 24); } // test case starting… function testGetLastDateOfMonth(year, month) { document.writeln(year + “/” + month + ” : ” + getLastDateOfMonth(year, month).toLocaleString() + “<br />”); } document.writeln(“<h1>JavaScript 获取某月最后一天(Date)测试结果</h1>”); document.writeln(“<h3>一般测试 :</h3>”); testGetLastDateOfMonth(2010, -1); testGetLastDateOfMonth(2010, 0); testGetLastDateOfMonth(2010, 1); testGetLastDateOfMonth(2010, 2); testGetLastDateOfMonth(2010, 3); testGetLastDateOfMonth(2010, 4); testGetLastDateOfMonth(2010, 5); testGetLastDateOfMonth(2010, 6); testGetLastDateOfMonth(2010, 7); testGetLastDateOfMonth(2010, 8); testGetLastDateOfMonth(2010, 9); testGetLastDateOfMonth(2010, 10); testGetLastDateOfMonth(2010, 11); testGetLastDateOfMonth(2010, 12); testGetLastDateOfMonth(2010, 13); document.writeln(“<h3>1月份测试 :</h3>”); testGetLastDateOfMonth(2008, 0); testGetLastDateOfMonth(2009, 0); testGetLastDateOfMonth(2010, 0); testGetLastDateOfMonth(2011, 0); testGetLastDateOfMonth(2012, 0); testGetLastDateOfMonth(2013, 0); testGetLastDateOfMonth(2014, 0); document.writeln(“<h3>2月份测试 :</h3>”); testGetLastDateOfMonth(2008, 1); testGetLastDateOfMonth(2009, 1); testGetLastDateOfMonth(2010, 1); testGetLastDateOfMonth(2011, 1); testGetLastDateOfMonth(2012, 1); testGetLastDateOfMonth(2013, 1); testGetLastDateOfMonth(2014, 1); document.writeln(“<h3>12月份测试 :</h3>”); testGetLastDateOfMonth(2008, 11); testGetLastDateOfMonth(2009, 11); testGetLastDateOfMonth(2010, 11); testGetLastDateOfMonth(2011, 11); testGetLastDateOfMonth(2012, 11); testGetLastDateOfMonth(2013, 11); testGetLastDateOfMonth(2014, 11); document.writeln(“<h3>BT月份测试(month <= 0) :</h3>”); testGetLastDateOfMonth(2010, 0); testGetLastDateOfMonth(2010, -1); testGetLastDateOfMonth(2010, -2); testGetLastDateOfMonth(2010, -3); testGetLastDateOfMonth(2010, -4); testGetLastDateOfMonth(2010, -5); testGetLastDateOfMonth(2010, -6); testGetLastDateOfMonth(2010, -7); testGetLastDateOfMonth(2010, -8); document.writeln(“<h3>BT月份测试(month >= 11) :</h3>”); testGetLastDateOfMonth(2010, 11); testGetLastDateOfMonth(2010, 12); testGetLastDateOfMonth(2010, 13); testGetLastDateOfMonth(2010, 14); testGetLastDateOfMonth(2010, 15); testGetLastDateOfMonth(2010, 16); testGetLastDateOfMonth(2010, 17); testGetLastDateOfMonth(2010, 18); testGetLastDateOfMonth(2010, 19); document.writeln(“<h3>BT年份测试(year = 0) :</h3>”); testGetLastDateOfMonth(0, 1); testGetLastDateOfMonth(0, 0); testGetLastDateOfMonth(0, -1); testGetLastDateOfMonth(0, -2); testGetLastDateOfMonth(0, -3); document.writeln(“<h3>BT年份测试(year <= 1) :</h3>”); testGetLastDateOfMonth(1, 0); testGetLastDateOfMonth(0, 0); testGetLastDateOfMonth(-1, 0); testGetLastDateOfMonth(-2, 0); testGetLastDateOfMonth(-3, 0); testGetLastDateOfMonth(-4, 0); testGetLastDateOfMonth(-5, 0); document.writeln(“<h3>BT年份测试(year > 9999) :</h3>”); testGetLastDateOfMonth(9999, 0); testGetLastDateOfMonth(10000, 0); testGetLastDateOfMonth(100001, 0); testGetLastDateOfMonth(100002, 0); testGetLastDateOfMonth(100003, 0); // –></mce:script>
【测试结果】
JavaScript 获取某月最后一天(Date)测试结果
一般测试 :
2010/-1 : 2009年12月31日 星期四 0:00:00
2010/0 : 2010年1月31日 星期日 0:00:00
2010/1 : 2010年2月28日 星期日 0:00:00
2010/2 : 2010年3月31日 星期三 0:00:00
2010/3 : 2010年4月30日 星期五 0:00:00
2010/4 : 2010年5月31日 星期一 0:00:00
2010/5 : 2010年6月30日 星期三 0:00:00
2010/6 : 2010年7月31日 星期六 0:00:00
2010/7 : 2010年8月31日 星期二 0:00:00
2010/8 : 2010年9月30日 星期四 0:00:00
2010/9 : 2010年10月31日 星期日 0:00:00
2010/10 : 2010年11月30日 星期二 0:00:00
2010/11 : 2010年12月31日 星期五 0:00:00
2010/12 : 2011年1月31日 星期一 0:00:00
2010/13 : 2011年2月28日 星期一 0:00:00
1月份测试 :
2008/0 : 2008年1月31日 星期四 0:00:00
2009/0 : 2009年1月31日 星期六 0:00:00
2010/0 : 2010年1月31日 星期日 0:00:00
2011/0 : 2011年1月31日 星期一 0:00:00
2012/0 : 2012年1月31日 星期二 0:00:00
2013/0 : 2013年1月31日 星期四 0:00:00
2014/0 : 2014年1月31日 星期五 0:00:00
2月份测试 :
2008/1 : 2008年2月29日 星期五 0:00:00
2009/1 : 2009年2月28日 星期六 0:00:00
2010/1 : 2010年2月28日 星期日 0:00:00
2011/1 : 2011年2月28日 星期一 0:00:00
2012/1 : 2012年2月29日 星期三 0:00:00
2013/1 : 2013年2月28日 星期四 0:00:00
2014/1 : 2014年2月28日 星期五 0:00:00
12月份测试 :
2008/11 : 2008年12月31日 星期三 0:00:00
2009/11 : 2009年12月31日 星期四 0:00:00
2010/11 : 2010年12月31日 星期五 0:00:00
2011/11 : 2011年12月31日 星期六 0:00:00
2012/11 : 2012年12月31日 星期一 0:00:00
2013/11 : 2013年12月31日 星期二 0:00:00
2014/11 : 2014年12月31日 星期三 0:00:00
BT月份测试(month <= 0) :
2010/0 : 2010年1月31日 星期日 0:00:00
2010/-1 : 2009年12月31日 星期四 0:00:00
2010/-2 : 2009年11月30日 星期一 0:00:00
2010/-3 : 2009年10月31日 星期六 0:00:00
2010/-4 : 2009年9月30日 星期三 0:00:00
2010/-5 : 2009年8月31日 星期一 0:00:00
2010/-6 : 2009年7月31日 星期五 0:00:00
2010/-7 : 2009年6月30日 星期二 0:00:00
2010/-8 : 2009年5月31日 星期日 0:00:00
BT月份测试(month >= 11) :
2010/11 : 2010年12月31日 星期五 0:00:00
2010/12 : 2011年1月31日 星期一 0:00:00
2010/13 : 2011年2月28日 星期一 0:00:00
2010/14 : 2011年3月31日 星期四 0:00:00
2010/15 : 2011年4月30日 星期六 0:00:00
2010/16 : 2011年5月31日 星期二 0:00:00
2010/17 : 2011年6月30日 星期四 0:00:00
2010/18 : 2011年7月31日 星期日 0:00:00
2010/19 : 2011年8月31日 星期三 0:00:00
BT年份测试(year = 0) :
0/1 : 1900年2月28日 星期三 0:00:00
0/0 : 1900年1月31日 星期三 0:00:00
0/-1 : 1899年12月31日 星期日 0:00:00
0/-2 : 1899年11月30日 星期四 0:00:00
0/-3 : 1899年10月31日 星期二 0:00:00
BT年份测试(year <= 1) :
1/0 : 1901年1月31日 星期四 0:00:00
0/0 : 1900年1月31日 星期三 0:00:00
-1/0 : Sun Jan 31 00:00:00 UTC+0800 2 B.C.
-2/0 : Sat Jan 31 00:00:00 UTC+0800 3 B.C.
-3/0 : Fri Jan 31 00:00:00 UTC+0800 4 B.C.
-4/0 : Wed Jan 31 00:00:00 UTC+0800 5 B.C.
-5/0 : Tue Jan 31 00:00:00 UTC+0800 6 B.C.
BT年份测试(year > 9999) :
9999/0 : 9999年1月31日 星期日 0:00:00
10000/0 : Mon Jan 31 00:00:00 UTC+0800 10000
100001/0 : Wed Jan 31 00:00:00 UTC+0800 100001
100002/0 : Thu Jan 31 00:00:00 UTC+0800 100002
100003/0 : Fri Jan 31 00:00:00 UTC+0800 100003