No hay una solución rápida para esto, desafortunadamente. La internacionalización de una aplicación debe ser parte de las primeras discusiones de diseño, ya que realmente va al núcleo de muchas áreas diferentes, incluidas las comparaciones de fecha / hora y el formato de salida.
De todos modos, para seguir el camino de Hacer lo correcto, es esencial almacenar la información de la zona horaria con la hora . En otras palabras, darse cuenta de que la fecha / hora no 20130407 14:50
tiene sentido sin (a) incluir el desplazamiento UTC actual de la zona horaria (nota 1) , o (b) garantizar que toda la lógica que inserte estos valores primero se convierta en un cierto desplazamiento fijo ( muy probablemente 0). Sin ninguna de esas cosas, dos valores de tiempo dados son incomparables y los datos están corruptos . (El último método es jugar con fuego (nota 2) , por cierto; no hagas eso).
En SQL Server 2008+, puede almacenar el desplazamiento con el tiempo directamente utilizando el datetimeoffset
tipo de datos. (Para completar, en 2005 y antes, agregaría una segunda columna para almacenar el valor de compensación UTC actual (en minutos)).
Esto facilita la aplicación de tipo escritorio, ya que estas plataformas normalmente tienen mecanismos para convertir automáticamente una fecha / hora + zona horaria a una hora local y luego formatear para la salida, todo en función de la configuración regional del usuario.
Para la web, que es una arquitectura intrínsecamente desconectada, incluso con los datos de fondo configurados correctamente, es más complejo porque necesita información sobre el cliente para poder realizar la conversión y / o formateo. Esto generalmente se hace a través de la configuración de preferencias del usuario (la aplicación convierte / formatea cosas antes de la salida), o simplemente muestra cosas con el mismo formato fijo y desplazamiento de zona horaria para todos (que es lo que hace actualmente la plataforma Stack Exchange).
Puede ver cómo si los datos de fondo no están configurados correctamente, muy rápidamente se volverá complicado y complicado. No recomendaría ir por ninguno de esos caminos porque terminarás con más problemas en el futuro.
Nota 1:
El desplazamiento UTC de una zona horaria no es fijo: considere el horario de verano donde el desplazamiento UTC de una zona varía en más o menos una hora. Además, las fechas de horario de verano de las zonas varían regularmente. Por lo tanto, usar datetimeoffset
(o una combinación de local time
y UTC offset at that time
) da como resultado la máxima recuperación de información.
Nota 2:
Se trata de controlar las entradas de datos. Si bien no hay una forma infalible de validar los valores entrantes, es mejor aplicar un estándar simple que no implique cálculos. Si una API pública espera un tipo de datos que incluya un desplazamiento, ese requisito será claro para la persona que llama.
Si ese no fuera el caso, la persona que llama tiene que confiar en la documentación (si la leyó), o el cálculo se realiza incorrectamente, etc. Hay menos modos de falla / error cuando se requiere un desplazamiento, en particular para un sistema distribuido ( o incluso solo web / base de datos en servidores separados como el caso aquí).
Almacenar el desplazamiento de todos modos mata a dos pájaros de un tiro; e incluso si eso no se requiere ahora , hace que la posibilidad esté disponible más adelante si es necesario. Es cierto que ocupa más espacio de almacenamiento, pero creo que vale la pena el intercambio porque los datos se pierden si nunca se registran en primer lugar.