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?

Publicado por

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.

13 comentários em “Data errada no Javascript? Bug?”

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

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

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

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

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

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