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?
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!!
Já tive esse problema em um projeto, é o horário de verão sim. Manda um..:
data = data.getUTCDate();
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.
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.
É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…
É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.