¿Cuál es la mejor práctica para guardar TimeZones en la base de datos?

12

Queremos comenzar a recopilar zonas horarias para cada una de nuestras direcciones en la base de datos. ¿Cuál es la mejor práctica para almacenar las zonas horarias? ¿Cómo haría para adquirir zonas horarias para los registros de direcciones existentes?

Estoy usando el servidor Microsoft SQL, .net mvc, C #. Cualquier sugerencia sería muy apreciada.

Rodney
fuente
Por cierto, un problema de zona horaria normal es usar un int, pero algunas zonas horarias pueden ser + o - 30 minutos, o incluso 15 minutos :) Ah, y recuerde que no es una ciencia exacta, el horario de verano y demás pueden desanimarlo.
Rocklan
2
@LachlanB una forma de decirlo es que la zona horaria es más una ubicación que un desplazamiento horario . Pero incluso ese punto de vista no es suficiente por sí solo, por ejemplo, Rusia cambió recientemente su política con respecto al horario de verano, lo que significa que tendría que tratarlo de manera diferente dependiendo de la fecha real.
Daniel B

Respuestas:

7

Desea almacenar algo que no cambia todo el tiempo (o dos veces al año). La base de datos de zona horaria https://en.wikipedia.org/wiki/List_of_tz_database_time_zones es exactamente lo correcto. Entonces solo guardas dos letras.

Desde esta base de datos puede consultar la diferencia horaria y cuándo está activo el horario de verano. No es solo el desplazamiento de tiempo, también le brinda un área, por lo que muchos lugares en la misma latitud tendrán códigos diferentes y pueden cambiar individualmente sus reglas de zona horaria, y su software podrá manejarlo.

El único momento en que necesita hacer cambios en su base de datos es cuando una ubicación cambia a qué zona horaria pertenece, lo cual sería muy raro.

gnasher729
fuente
Tenga en cuenta que la lista en wikipedia no contiene abreviaturas de 2 caracteres para todas las zonas horarias de la IANA, además la asignación no es inequívoca. Si necesita información histórica completa, busque los nombres completos en su lugar.
Hulk
2
Los únicos códigos de dos letras que veo en la página de Wikipedia son códigos de países. Estos no definen únicamente zonas horarias. Por ejemplo, todas las zonas horarias en los EE. UU. Tienen el mismo código de país de dos letras: EE. UU. Del mismo modo, en toda Australia tienen el código de país AU.
Ian
3

La mejor práctica absoluta sería utilizar una base de datos que admita el TIMESTAMP WITH TIMEZONEtipo de datos definido por SQL99.

SQL Server tiene un tipo llamado datetimeoffsetque hace todo lo que TIMESTAMP WITH TIMEZONEpuede hacer excepto almacenar la zona horaria real. Todo lo que puede hacer es almacenar un desplazamiento desde UTC (por ejemplo, 2013-05-04 12:34:56 -5:00), lo que significa que tendrá que determinarlo antes del almacenamiento en función de la zona horaria.

Blrfl
fuente
3

Suponiendo que está utilizando .Net Framework 4.0 o superior, TimeZoneInfo es lo que necesita.

Almacene todos los valores de fecha en la base de datos en formato UTC. Utilice el valor de ID o el resultado de ToSerializedString () para cada cliente para crear un objeto TimeZoneInfo para convertir las fechas almacenadas al formato local para su visualización.

Halcón peregrino
fuente
2

Ha dicho que desea almacenar una zona horaria para cada dirección en su base de datos, pero no ha dicho qué quiere hacer con ella. Almacenar algo en un DB rara vez es un fin en sí mismo.

En cualquier caso, trataría de utilizar la base de datos TZ , también conocida como la base de datos Olsen, ya sea directamente o mediante el uso de algún software estándar que integre TZ. Puede almacenar una zona horaria simplemente como una cadena para referirse a una de las entradas de TZ DB , por ejemplo, 'África / Kampala' o 'Europa / París'.

bdsl
fuente