As operações com datas no javascript sofrem da variação de fuso horário no qual a máquina cliente está configurada.
Certa oportunidade tive que consertar uma função que apresentava diferença entre datas e ninguém sabia o porque. Quando você instancia uma data, o retorno dela aparecerá assim:”Thu Feb 14 2008 08:41:27 GMT-0300 (Hora oficial do Brasil)”.
Observe que na data consta o GMT (Greenwich Mean Time) que indica em que fuso horário a data está configurada.
Vou demonstrar como evitar a diferença de tempo provocada por isso em operações com data. Para isso basta criar uma função que converta a data sempre para o fuso que se espera.
var calcularFuso = function(data, offset) {
var milisegundos_com_utc = data.getTime() + (data.getTimezoneOffset() * 60000);
return new Date(milisegundos_com_utc + (3600000 * offset));
}
Observe que na linha 3, invocamos o método getTime() que converte o momento local da data para um número representado pelos milisegundos desde 1º de Janeiro de 1970 (Unix Epoch). Obtemos o atual fuso horário que está configurado no browser pelo método getTimezoneOffset() da API de data no javascript e multiplicamos pelos milisegundos de tempo de uma hora. Somamos então os dois valores.
Porque uma hora? Porque esse é o tempo que representa cada fuso horário. Por default esse método retorna esse fuso horário em minutos, por isso a conversão em hora é necessária.
Para chegar nesse número 60000 você tem que lembrar que 1 segundo tem 1000 milisegundos e que 1 minuto tem 60 segundos, então convertendo minutos para milisegundos multiplicamos 60 * 1000 = 60000.
Nesse momento temos o UTC (Coordinated Universal Time) representado pela variável “utc” pela soma do momento local mais o fuso horário local em milisegundos.
Precisamos agora obter uma data a partir desse UTC somado com o fuso horário de destino, como por exemplo uma data expressa no fuso +5 transformado no fuso do Brasil (hora de Brasília) -3.
Observe que na linha 5 que obtemos um offset (representação do fuso) em hora e convertemos para milisegundos. Lembre-se aqui que 1 segundo tem 1000 milisegundos e que 1 hora tem 3600 segundos, portanto converter hora em milisegundo deve-se multiplicar 1000 * 3600 = 3600000.
Somamos esse resultado com o valor da variável “utc” e obtemos o momento para o fuso horável desejado, a partir daí criamos uma nova data com base no long apropriado e retornamos essa nova data.
Dessa forma conseguimos manter a integridade desejada na aplicação quando precisamos expressar a data no fuso horário correto.
Boa dica Milfont!
rss.. bacana 🙂 Nunca passei por isso, mas fica aí a dica 😀
Pingback: Christiano via Rec6
Cara, eu fiz assim:
var Data = new Date();
var Fuso = Data.getTimezoneOffset()/60 – 3;
if (Fuso) Data = new Date(Data.valueOf() + (Fuso * 3600000));
Depois do IF, já sai com o horário de BR certinho, seja lá qual for o fuso; e só entra no IF se o fuso for diferente.
mal dica!!
q bosta hein?/
v se seja mais expressivo!!
Scroyse , você quer que eu desenhe?
Você poderia ao menos publicar a fonte dessa informação, já que não foi você quem a “criou”:
http://articles.techrepublic.com.com/5100-10878_11-6016329.html
@Vinicius, muito bom o link, mas tenho essa função já tem mais de 5 anos, e peguei sim de foruns na época mas não tenho link de onde peguei.
putz, mais explicado do que isso só ele fazendo o .JS pra vcs!!!
fala sério!!
@.cmilfont, otimo post!!!