Data errada no Javascript? Bug?

Um amigo me escreveu agora para mostrar algo muito curioso. Abra sua Firebug, ou qualquer outro lugar onde você roda Javascript, e teste:

new Date(2008,8,11)

Você deve ter como retorno um objeto de data, que se impresso mostra:

Thu Sep 11 2008 00:00:00 GMT-0300 (BRT)

Porque setembro e não agosto, você pode se perguntar. É porque em Javascript, assim com na maioria das linguagens de programação, arrays começam com zero, então faz sentido que contadores também comecem com zero. Assim, janeiro é o mês zero, e se você precisar construir um array com os nomes dos meses, janeiro será o primeiro do array. Faz todo o sentido.

Agora, o que não faz sentido. Tente:

new Date(2008,9,12)

Aqui no meu sistema eu obtive:

Sat Oct 11 2008 23:00:00 GMT-0300 (BRT)

Ou seja, uma hora mais cedo. O que será isso? Correção para o horário de verão? Se é, em que regra se baseia? Os horários de verão no Brasil mudam todo ano, e dependem de em que estado você está.

Alguém tem alguma dica?

Elcio: Elcio é sócio fundador da Visie Padrões Web. Pioneiro no uso e divulgação dos padrões do W3C no Brasil, Elcio já treinou equipes de dezenas de empresas como Globo.com, Terra, Petrobras, iG e Locaweb. Além disso, tem dirigido as equipes da Visie no desenvolvimento de projetos web para marcas como Brastemp, Itaú Unibanco, Johnson & Johnson e Rede Globo.

View Comments (13)

  • Algo curioso acontece e gostaria se alguém souber a resposta.Quando digito a minha data de nascimento 19/10/1980,sempre mostra como inválida em tudo crtão de crédito contas etc.Gostaria de saber por que!!

  • Basta setar o mês novamente... tipo chamar a função duas vezes para setar o mês!

    date.setMonth(m - 1);

    simples.

  • Haha, por incrível que pareça em meados de 2013 passei por esse problema ao validar uma usando a função à baixo, pois ao colocar a data: 19/10/1980, sempre dizia que a data era inválida, adotei a solução comentada por Mateus Lazzarin "and now it works like a charm"!
    function validarData(data)
    {
    var dia = data.substring(0,2)
    var mes = data.substring(2,4)
    var ano = data.substring(4)

    //Criando um objeto Date usando os valores ano, mes e dia.
    var novaData = new Date(ano,(mes-1),dia, 1,0,0);
    var mesmoDia = parseInt(dia) == parseInt(novaData.getDate());
    var mesmoMes = parseInt(mes) == parseInt(novaData.getMonth())+1;
    var mesmoAno = parseInt(ano) == parseInt(novaData.getFullYear());

    return ((mesmoDia) && (mesmoMes) && (mesmoAno))
    }

  • O comentário do Mateus Lazzarin resolve todo o problema... Independente de o pc estar com ajuste automático para horário de verão ou não.... Basta ao criar o objeto Date, garantir que seja criado acima de uma hora da manha.

    Valeu pela ótima percepção e ajuda.

  • Carinha, é o seguinte.. eu tive problema com isso e achei uma solução.. Por padrão o windows configura o horario de verão para o segundo domingo de outubro em todos os anos (parece q existe uma atualização e isso se marcar pode ser interferido para o primeiro domingo de outubro por exemplo), portanto se vc utilizar 12/10/2008, 14/10/2007, 08/10/2006, 12/10;1980, etc, sempre o seu retorno será o dia anterior com horario de 23:00:00 pq o JavaScript atribui o a hora do dia passado como 00:00:00 por default caso vc não passe nada na função Date(), portanto: dia com 00:00:00 - 1 hora = dia anterior 23:00:00 correto?. Como burlar isso? Simples. Na função Date() do JavaScript force o horário passado dessa maneira --> new Date(2008,8,11, 01, 00, 00). Fazendo isso, vc garantirá o horário mesmo se o horário de verão retirar uma hora do dia.

    Espero ter ajudado!!

  • Será mesmo por causa do horário de verão? Porque quanto o horário da máquina está em horário de verão, temos o BRST, e não BRT.

  • Fiz os testes que você menciona no blog, e não tive 1 hora de defasagem de um teste para o outro os 2 retornaram 00:00:00 rsrsrs

  • Élcio, se a função "Ajustar automaticamente para horário de verão" estiver habilitada no Windows, vai dar essa diferença.
    Aqui no meu PC, está desabilitado e a hora apareceu corretamente.

  • Não, Érico, é uma hora mesmo a diferença, está certo. Lembre-se que o mês 9, em javascript, é outubro.

    Ciro, trouxe alguma luz, obrigado.