Calcular o último dia do mês em JavaScript

Se você fornecer 0 como dayValue em Date.setFullYear receberá o último dia do mês anterior:

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

Há referência a esse comportamento no mozilla . Este é um recurso confiável entre navegadores ou devo procurar methods alternativos?

   
 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) 

Diferenças de saída são devidas a diferenças na implementação toString() , não porque as datas são diferentes.

É claro, só porque os navegadores identificados acima usam 0 como o último dia do mês anterior não significa que continuarão a fazê-lo, ou que os navegadores não listados o farão, mas dá credibilidade à crença de que ele deve funcionar mesma forma em todos os navegadores.

Eu usaria uma data intermediária com o primeiro dia do próximo mês e retornaria a data do dia anterior:

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

Acho que esta é a melhor solução para mim. Deixe o object Date calculá-lo para você.

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

Definir o parâmetro day como 0 significa um dia a menos que o primeiro dia do mês que é o último dia do mês anterior.

Meu colega tropeçou no seguinte, que pode ser uma solução mais fácil

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

roubado de http://snippets.dzone.com/posts/show/2099

Em termos de computador, as new Date() soluções new Date() e regular expression são lentas! Se você quer um one-liner super-rápido (e super-enigmático), tente este (supondo que m esteja no formato Jan=1 ). Eu continuo tentando mudanças de código diferentes para obter o melhor desempenho.

Minha versão mais rápida atual:

Depois de olhar para esta questão relacionada, checando o ano bissexto usando operadores bitwise (velocidade incrível) e descobrindo o que o número mágico 25 & 15 representa, eu criei este híbrido otimizado de respostas:

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

Dada a mudança de bits, isso obviamente pressupõe que seus parâmetros de m & y são ambos inteiros, já que passar números como strings resultaria em resultados estranhos.

JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/

Resultados do JSPerf: http://jsperf.com/days-in-month-head-to-head/5

Por alguma razão, (m+(m>>3)&1) é mais eficiente que (5546>>m&1) em quase todos os navegadores.

A única verdadeira competição pela velocidade é do @GitaarLab, então eu criei um JSPerf frente-a-frente para testarmos em: http://jsperf.com/days-in-month-head-to-head/5


Ele funciona com base na minha resposta do ano bissexto aqui: javascript para encontrar ano bissexto esta resposta aqui Cheque ano bissexto usando operadores bitwise (velocidade incrível) , bem como a lógica binária a seguir.

Uma lição rápida em meses binários:

Se você interpretar o índice dos meses desejados (Jan = 1) em binário, você notará que os meses com 31 dias têm bit 3 clear e bit 0 set, ou bit 3 set e bit 0 clear.

 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 

Isso significa que você pode mudar o valor 3 lugares com >> 3 , XOR os bits com o original ^ m e ver se o resultado é 1 ou 0 na posição do bit 0 usando & 1 . Nota: Acontece que + é ligeiramente mais rápido que XOR ( ^ ) e (m >> 3) + m dá o mesmo resultado no bit 0.

Resultados do JSPerf : http://jsperf.com/days-in-month-perf-test/6

Uma ligeira modificação na solução fornecida pelo lebreeze :

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

Isso funciona para mim. Fornecerá o último dia do ano e mês indicados:

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

tente este.

 lastDateofTheMonth = new Date(year, month, 0) 

exemplo:

 new Date(2012, 8, 0) 

saída:

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

Este funciona bem:

 Date.prototype.setToLastDateInMonth = function () { this.setDate(1); this.setMonth(this.getMonth() + 1); this.setDate(this.getDate() - 1); return this; } 
 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)); } 

definir o mês que você precisa para data e, em seguida, defina o dia para zero, então mês começa em 1 – 31 na function de data, em seguida, obter o último dia ^^

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

Eu sei que é apenas uma questão de semântica, mas acabei usando desta forma.

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

Como as funções são resolvidas a partir do argumento interno, elas funcionam da mesma maneira.

Você pode então replace o ano e o mês / ano pelos detalhes necessários, seja a partir da data atual. Ou um determinado mês / ano.

Abaixo function dá o último dia do mês:

 function getLstDayOfMonFnc(date) { return new Date(date.getFullYear(), date.getMonth(), 0).getDate() } console.log(getLstDayOfMonFnc(new Date(2016, 2, 15))) // Output : 29 console.log(getLstDayOfMonFnc(new Date(2017, 2, 15))) // Output : 28 console.log(getLstDayOfMonFnc(new Date(2017, 11, 15))) // Output : 30 console.log(getLstDayOfMonFnc(new Date(2017, 12, 15))) // Output : 31 

Da mesma forma, podemos obter o primeiro dia do mês:

 function getFstDayOfMonFnc(date) { return new Date(date.getFullYear(), date.getMonth(), 1).getDate() } console.log(getFstDayOfMonFnc(new Date(2016, 2, 15))) // Output : 1 

Isso lhe dará o mês atual primeiro e último dia.

Se você precisar alterar o ‘ano’, remova d.getFullYear () e defina seu ano.

Se você precisar alterar ‘mês’, remova d.getMonth () e defina seu ano.

 var d = new Date(); var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; var fistDayOfMonth = days[(new Date(d.getFullYear(), d.getMonth(), 1).getDay())]; var LastDayOfMonth = days[(new Date(d.getFullYear(), d.getMonth() + 1, 0).getDay())]; console.log("First Day :" + fistDayOfMonth); console.log("Last Day:" + LastDayOfMonth); alert("First Day :" + fistDayOfMonth); alert("Last Day:" + LastDayOfMonth); 

Não, nem todos os navegadores usarão 0 como o último dia. IE e Firefox, mas o Opera não.

Confira a seguinte fonte para mais informações:

Último dia do mês