Sites e sistemas rápidos, acessíveis, bem posicionados no Google e, o que é mais importante, fáceis de usar.

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?

Adicionar esta notícia no Linkk

9 comentários para “Data errada no Javascript? Bug?”

  1. Ciro Feitosa Says:

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

  2. Érico Andrei Says:

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

  3. Walter Cruz Says:

    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.

  4. Elcio Says:

    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.

  5. Thiago H. Melo Says:

    É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. Igor Escobar Says:

    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

  7. Adriano Says:

    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. Julio Anderson Says:

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

    data = data.getUTCDate();

  9. Mateus Lazzarin Says:

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

Deixe um comentário