Guias

Localize formatos de data e hora usando o fuso horário do visitante

Um timestamp exibido no fuso horário do seu servidor só faz sentido para quem por acaso está nesse mesmo fuso, o que, para um site com visitantes de qualquer lugar, é quase ninguém.

Obtendo o fuso do visitante

Uma consulta de IP retorna diretamente um campo timezone, que fornece o identificador necessário para localizar qualquer timestamp da página.

GET /v1/ip?ip=203.0.113.77
{
  "status": "ok",
  "ip": "203.0.113.77",
  "version": 4,
  "found": true,
  "country": "Brazil",
  "country_code": "BR",
  "region": "Rio de Janeiro",
  "city": "Rio de Janeiro",
  "postcode": "20040",
  "lat": -22.9068,
  "lon": -43.1729,
  "timezone": "America/Sao_Paulo",
  "asn": 5566,
  "org": "Example ISP"
}

Convertendo timestamps armazenados

Armazene todos os timestamps no banco de dados em UTC, como de costume, e converta para o fuso local do visitante apenas no momento da exibição, no servidor, usando o identificador de fuso horário que você consultou. Como este site renderiza tudo no servidor, sem JavaScript no cliente, a conversão e a formatação acontecem antes de a página ser enviada, e não depois, no navegador.

local_time = convert_to_timezone(stored_utc_timestamp, "America/Sao_Paulo")

Um segundo exemplo: o timestamp de uma confirmação de pedido

Uma página de confirmação de pedido que mostra os horários de "feito em" e "previsto para" é um bom exemplo de onde isso importa além de um simples relógio no cabeçalho. Converter os dois timestamps pelo mesmo fuso do visitante, em vez de deixar um deles no horário do servidor por descuido, mantém os dois valores consistentes e evita a situação confusa em que o horário previsto de entrega parece anterior ao horário do pedido porque um foi convertido e o outro não.

Formatar, e não apenas converter

Fuso horário e formato são escolhas relacionadas, mas separadas. Um visitante em um fuso onde é comum usar o relógio de 24 horas e a ordem dia-mês-ano nas datas se beneficia de uma formatação correspondente, e não apenas de um valor de hora deslocado escrito em um formato que continua parecendo estrangeiro. Combine o country_code da mesma consulta de IP com uma pequena tabela de formatos se quiser ir além de apenas ajustar a hora.

Um erro comum a evitar

Não implemente a conversão como um deslocamento fixo de horas calculado uma vez e aplicado a todos os timestamps dali em diante. O deslocamento real de um fuso em relação ao UTC pode mudar ao longo do ano com o horário de verão, então um timestamp convertido corretamente em uma estação pode sair com uma hora de erro em outra se o código aplicar um número de deslocamento armazenado em vez de converter pelo próprio identificador de fuso horário usando uma biblioteca adequada de data e hora.

Um caso extremo: deslocamentos que não são horas inteiras

Nem todo fuso horário fica a um deslocamento de horas inteiras em relação ao UTC. Alguns estão deslocados em 30 ou 45 minutos, em vez de uma hora cheia. Usar uma biblioteca de datas que entenda o identificador completo de fuso horário da IANA, em vez de um valor de deslocamento simplificado só em horas, trata isso corretamente sem nenhum código de caso especial da sua parte. Os campos utc_offset e abbreviation da documentação da consulta de fuso horário são úteis se você quiser exibir o deslocamento explicitamente ao lado de um horário convertido.

Guardando o fuso em cache durante a sessão

Consulte o fuso horário uma vez por sessão de visitante e reutilize-o para todos os timestamps renderizados em todas as páginas durante essa visita, em vez de chamar a API de novo para cada data exibida, já que o próprio fuso não muda no meio da sessão.

Custo de localizar um site inteiro

Uma consulta por nova sessão cobre a localização de todos os timestamps exibidos durante essa visita, uma requisição, não importa quantas datas apareçam na página. Isso mantém até um site com muito conteúdo bem dentro das 2.500 requisições gratuitas por dia incluídas em cada chave.

Acertar o horário local e a formatação de datas em um site inteiro se resume a uma consulta por sessão e a uma renderização consistente no servidor depois disso. A documentação da consulta de IPv4 e a documentação da consulta de fuso horário cobrem as duas formas de obter o fuso.