Datas e Fuso horário no Javascript

{ February 24th, 2008 }


cmilfont

Autor: cmilfont

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.

Categories: JavaScript, Web Development ~ ~ Trackback


Assine os comentários deste artigo.


9 Responses to “Datas e Fuso horário no Javascript”

  1. 1
    Rafael Carneiro

    Boa dica Milfont!

  2. 2
    Rafael Ponte

    rss.. bacana :) Nunca passei por isso, mas fica aí a dica 😀

  3. 3
    Christiano via Rec6

    Datas e Fuso horário no Javascript – CMilfont Tech…

    Operação com datas para corrigir o fuso horário….

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

  5. 5
    Scroyse

    mal dica!!
    q bosta hein?/
    v se seja mais expressivo!!

  6. 6
    cmilfont

    Scroyse , você quer que eu desenhe?

  7. 7
    Vinicius

    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

  8. 8
    cmilfont

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

  9. 9
    @mario

    putz, mais explicado do que isso só ele fazendo o .JS pra vcs!!!

    fala sério!!

    @.cmilfont, otimo post!!!

Leave a Reply