Datas e Fuso horário no Javascript

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.

Typically chemist’s shop can sale to you with discreet treatments for various soundness problems. There are numerous of safe online pharmacies that will deliver medications to your address. There are divers medicines for each afflictions. Learn more about “viagra manufacturer coupon“. Maybe “viagra discount coupons” is a very complicated problem. Matters, like “coupons for viagra“, are united numerous types of soundness problems. If you need to take prescription medications, ask your druggist to check your testosterone levels before. Sometimes the treatment options may switch on erectile dysfunction remedies or a suction device that helps get an hard-on. Keep in mind web-site which is ready to sell erectile dysfunction drugs like Viagra without a prescription is fraudulent. When you purchase from an unknown web-site, you run the risk of getting counterfeit remedies.

9 thoughts on “Datas e Fuso horário no Javascript

  1. Pingback: Christiano via Rec6

  2. Binho

     
    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.
     

  3. cmilfont Post author

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

Comments are closed.