Último dia do mês - Javascript


Motivado pelo sucesso da postagem Último dia do mês - SQL Server que ensina como obter de forma segura , ou seja, sem cair em pegadinhas de ano bissexto, o último dia para qualquer ano e mês  desejado em TSQL. Resolvi então iniciar a série "Último dia do mês" onde vamos a cada post explicar como obter esse resultado em diversas linguagens de programação.

Podemos considerar a postagem sobre TSQL como sendo um piloto. Por isso essa será a postagem de abertura da série e iremos falar de JavaScript.

Direto ao código:

// Comment
var ano = 2012;

var mes = 1; /*fevereiro em javascript é 1 pois os meses são contados a partir de 0 que significa janeiro*/;

var ultimoDiaDeFevereiro2012 = (new Date(ano, mes + 1, 0 )).getDate();

alert("O último dia de fevereiro de 2012 é: " + ultimoDiaDeFevereiro2012)


Encapsulando em uma função:

function RetornaUltimoDiaDoMes(qualquerObjetoDate){
 return (new Date(qualquerObjetoDate.getFullYear(), qualquerObjetoDate.getMonth() + 1, 0) ).getDate();
}

Utilizando a função:

var minhaData = new Date(2012, 1, 10); // dez de fevereiro de 2012

var ultimoDiaDeFevereiro2012 = RetornaUltimoDiaDoMes(minhaData);

alert("O último dia de fevereiro de 2012 é: " + ultimoDiaDeFevereiro2012);




O curioso é que até realizar a pesquisa para escrever esse post eu não conhecia essa solução. E quando me deparei com ela no blog do Luiz Paulo ( @lppjunior ) na postagem http://blog.lppjunior.com/javascript-ultimo-dia-do-mes/ reagi com estranheza e duvidei que funcionava. A mais de 6 anos programando em javascript nunca havia visto em nenhuma literatura esse tipo de detalhe sobre o construtor de Date. 

Rapidamente então resolvi conferir abri o nodeJS rapidinho aqui no console para rodar uns testes e a solução funcionou. Ainda assim eu fiquei desconfiado e pensei: - "Não deve rodar nas versões mais antigas. Vou fazer testes no IE6.". Abri aqui a minha máquina virtual e verifiquei que a versão JavaScript do IE6 era 1.3 realizei o teste e deu tudo lindo. Obrigado @lppjunior eu sei que sua postagem de 2008 não está como 1 resultado no Google de bobeira né. 

Como realmente de alguma maneira eu gostaria de deixar a minha contribuição aqui resolvi ir um pouco mais a fundo para descobrir aonde eu poderia achar isso na definição da linguagem javascript. Resolvi então fazer uma visita a definição da linguagem no site da ECMA.


O macete aqui é que quando passamos 0 como argumento para o parâmetro para dia no construtor new Date(ano, mes, dia) acabamos na verdade pedindo o dia anterior. Isso acontece devido a natureza do algirítimo MakeDay(year, month, date) contido na definição Standard ECMA-262 - ECMAScript Language Specification. Vejam só o passo 8 desse algoritmo nesse excerto da página 168 desse documento:


Veja também:


Comentários

Postagens mais visitadas deste blog

Curtir publicações automaticamente no Facebook. Por que isso não é uma boa idéia?