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.
1 2 3 4 5 6 7 8 9 | var calcularFuso = function(data, offset) { var utc = data.getTime() + (data.getTimezoneOffset() * 60000); var nd = new Date(utc + (3600000*offset)); return nd; } |
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.
Categories: JavaScript, Web Development ~ ~ Trackback
February 24th, 2008 at 7:29 am
Boa dica Milfont!
February 24th, 2008 at 9:04 am
rss.. bacana
Nunca passei por isso, mas fica aà a dica
February 24th, 2008 at 9:07 am
Datas e Fuso horário no Javascript – CMilfont Tech…
Operação com datas para corrigir o fuso horário….
March 15th, 2008 at 5:08 pm
Â
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.
Â
November 19th, 2008 at 12:57 pm
mal dica!!
q bosta hein?/
v se seja mais expressivo!!
March 4th, 2009 at 6:51 am
Scroyse , você quer que eu desenhe?
June 30th, 2009 at 8:19 am
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
June 30th, 2009 at 8:28 am
@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.
October 16th, 2009 at 7:50 am
putz, mais explicado do que isso só ele fazendo o .JS pra vcs!!!
fala sério!!
@.cmilfont, otimo post!!!