Guías

Adapta los formatos de fecha y hora a la zona horaria del visitante

Una marca de tiempo mostrada en la zona horaria de tu servidor solo se lee correctamente para quien esté en esa misma zona, lo que, en un sitio con visitantes de cualquier lugar, es prácticamente nadie.

Obtener la zona del visitante

Una consulta de IP devuelve directamente un campo timezone, que te da el identificador necesario para localizar cualquier marca de tiempo de la 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"
}

Convertir las marcas de tiempo almacenadas

Guarda todas las marcas de tiempo en tu base de datos en UTC, como siempre, y conviértelas a la zona local del visitante solo en el momento de mostrarlas, en el servidor, con el identificador de zona horaria que consultaste. Como este sitio lo renderiza todo en el servidor, sin JavaScript en el cliente, tanto la conversión como el formato se aplican antes de enviar la página, no después en el navegador.

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

Un segundo ejemplo: la marca de tiempo de una confirmación de pedido

Una página de confirmación de pedido que muestra las horas de «realizado a las» y «previsto para» es un buen ejemplo de dónde esto importa más allá de un simple reloj en la cabecera de la página. Convertir ambas marcas de tiempo con la misma zona del visitante, en lugar de dejar una en la hora del servidor por descuido, mantiene coherentes las dos cifras y evita la situación confusa en la que la hora de entrega prevista parece anterior a la hora del pedido porque una se convirtió y la otra no.

Dar formato, no solo convertir

La zona horaria y el formato están relacionados, pero son decisiones distintas. Un visitante de una zona que suele usar el reloj de 24 horas y el orden día-mes-año para las fechas se beneficia de un formato acorde, no solo de un valor de hora desplazado escrito en un formato que sigue pareciendo extranjero. Combina el country_code de la misma consulta de IP con una pequeña tabla de formatos si quieres ir más allá de ajustar la hora.

Un error habitual que debes evitar

No implementes la conversión como un desfase horario fijo calculado una vez y aplicado a todas las marcas de tiempo a partir de entonces. El desfase real de una zona respecto a UTC puede cambiar a lo largo del año con el horario de verano, así que una marca de tiempo convertida correctamente en una estación puede quedar desfasada una hora en otra si el código aplica un número de desfase almacenado en lugar de convertir mediante el propio identificador de zona horaria con una biblioteca de fecha y hora adecuada.

Un caso límite: desfases que no son de horas completas

No todas las zonas horarias tienen un desfase de horas completas respecto a UTC. Algunas tienen un desfase de 30 o 45 minutos en lugar de una hora completa. Usar una biblioteca de fechas que entienda el identificador completo de zona horaria IANA, en lugar de un valor de desfase simplificado solo en horas, lo gestiona correctamente sin ningún código para casos especiales por tu parte. Los campos utc_offset y abbreviation de la documentación de la consulta de zona horaria son útiles si quieres mostrar el desfase de forma explícita junto a una hora convertida.

Guardar la zona en caché durante la sesión

Consulta la zona horaria una vez por sesión de visitante y reutilízala para cada marca de tiempo que se muestre en cada página durante esa visita, en lugar de llamar de nuevo a la API por cada fecha mostrada, ya que la zona en sí no cambia a mitad de la sesión.

Coste de localizar todo un sitio

Una consulta por cada sesión nueva cubre la localización de todas las marcas de tiempo mostradas durante esa visita, una sola solicitud sin importar cuántas fechas aparezcan en la página. Así, incluso un sitio con mucho contenido se mantiene holgadamente dentro de las 2.500 solicitudes gratuitas al día incluidas con cada clave.

Mostrar bien la hora local y el formato de fecha en todo un sitio se reduce a una consulta por sesión y a un renderizado coherente en el servidor a partir de ahí. La documentación de la consulta de IPv4 y la documentación de la consulta de zona horaria cubren ambas formas de obtener la zona.