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?


13 respostas para “Data errada no Javascript? Bug?”

  1. Avatar de Alexandre
    Alexandre

    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!!

  2. Avatar de bruno
    bruno

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

    date.setMonth(m – 1);

    simples.

  3. Avatar de Bruno Douglas

    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))
    }

  4. Avatar de Ivo Filho
    Ivo Filho

    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.

  5. Avatar de Mateus Lazzarin
    Mateus Lazzarin

    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!!

  6. Avatar de Julio Anderson
    Julio Anderson

    Já tive esse problema em um projeto, é o horário de verão sim. Manda um..:

    data = data.getUTCDate();

  7. Avatar de Adriano

    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.

  8. Avatar de Igor Escobar
    Igor Escobar

    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

  9. Avatar de Thiago H. Melo
    Thiago H. Melo

    É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.

  10. Avatar de Elcio

    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.

  11. Avatar de Walter Cruz

    Horário de verão. Da especificação do JavaScript, seção 15.9.1.9: An implementation of ECMAScript is expected to determine the daylight saving time algorithm.

    Um teste simples:

    zdump -v Brazil/East|grep 2008
    Brazil/East Sun Feb 17 01:59:59 2008 UTC = Sat Feb 16 23:59:59 2008 BRST isdst=1 gmtoff=-7200
    Brazil/East Sun Feb 17 02:00:00 2008 UTC = Sat Feb 16 23:00:00 2008 BRT isdst=0 gmtoff=-10800
    Brazil/East Sun Oct 12 02:59:59 2008 UTC = Sat Oct 11 23:59:59 2008 BRT isdst=0 gmtoff=-10800
    Brazil/East Sun Oct 12 03:00:00 2008 UTC = Sun Oct 12 01:00:00 2008 BRST isdst=1 gmtoff=-7200

    Ou seja, o horáiode verão em 2008 começa em 12 de outubro.. Bom, pelo menos a maior parte das distros não pegou ainda a norma atualizada recentemente pelo Lula. Como teste, instalei o tzbrazil, mas ele ainda não tem a questão do horário de 2008 definada. Ao menos, o new Date(2008,9,12) funcionou como esperado, já que essa data é removida como início do horário de verão ao instalar o tzbrazil.

  12. Avatar de Érico Andrei

    Élcio, se no seu sistema o new Date(2008,9,12) deu Sat Oct 11 2008 23:00:00 GMT-0300 (BRT) o problema é um POUCO maior… Não tem 1h de defasagem e sim vários dias…

  13. Avatar de Ciro Feitosa

    Élcio, vai depender do SO, se está com a função de “ajustar automaticamente o relógio para o horário de verão”. Fiz um teste com a função ativada e desativada, e realmente deu diferença.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *