Pregunta

Necesito almacenar las reglas de cambio del horario de verano (horario de verano) para diferentes regiones del mundo en una base de datos. Ya tengo una forma de almacenar regiones y subregiones (por lo tanto, todo La "mitad del problema de Australia" / Arizona / Navaho está resuelto), pero me pregunto cuál sería el esquema más eficiente para lograrlo. Las dos opciones como las veo:

  • Tenga una tabla que contenga una única fila para cada año y región que indique las horas de inicio y finalización del horario de verano, así como el desplazamiento específico.
  • Tenga una tabla que almacene una fórmula y un rango de fechas efectivas para cada región (rango efectivo requerido para regiones como Israel)

La ventaja para el primero es la flexibilidad, ya que literalmente cualquier cosa es posible. Desafortunadamente, también requiere (a) más espacio y, en consecuencia, (b) mucho trabajo para obtener la entrada de datos. El segundo es bueno porque una fila podría corresponder a una región durante décadas, pero también requiere algún tipo de analizador e intérprete de lenguaje en la capa de aplicación. Ya que esta base de datos será utilizada por varias aplicaciones diferentes escritas en idiomas sin capacidades de procesamiento de texto potentes, preferiría evitar esa ruta.

Me encantaría simplemente usar zoneinfo o algo así, pero desafortunadamente no es una opción en este caso. Del mismo modo, no puedo normalizar las fechas, la zona horaria y la información del horario de verano debe estar en la base de datos para satisfacer ciertos casos de uso.

¿Alguien tiene alguna experiencia haciendo algo similar? Del mismo modo, ¿alguien tiene alguna opción brillante que pueda haber omitido?

¿Fue útil?

Solución

Estás bastante condenado a la primera opción. Puede generar previamente las fechas con la mayor anticipación que desee para los países que tienen " reglas " con respecto a los cambios de horario, pero algunas áreas no tienen ninguna regla y los cambios se promulgan ya sea por mandato dictatorial o por voto legislativo anualmente (Brasil lo hizo hasta este año).

Esta es la razón por la que todos los proveedores de sistemas operativos implementan cambios en el archivo de zona horaria una o dos veces al año; tienen que hacerlo porque no pueden generar un archivo 100% preciso programáticamente.

Otros consejos

Si las reglas de DST deben estar en la base de datos, probablemente elegiría actualizarlas automáticamente desde una fuente autorizada externa (biblioteca, sitio web, lo que sea). El mantenimiento manual de las reglas de DST no suena muy divertido.

Una de las mejores fuentes de información sobre las reglas de zona horaria es la base de datos Olson, que estaba disponible en elsie.nci.nih.gov . En septiembre de 2008, la versión actual de los datos era tzdata2008f.tar.gz, la versión actual del código era tzcode2008e.tar.gz (y sí, el código no siempre se publicó cuando los datos lo estaban). Esto tiende a ser la fuente de información para muchos otros sistemas (incluida, en particular, la información de Oracle). También hay una lista de correo disponible. Como puede ver, ha habido seis versiones de los datos hasta el momento en 2008; Tengo copias de 2005r, 2006l, 2007k al acecho en mi máquina, por lo que las cosas pueden cambiar con bastante frecuencia.

Hoy en día (marzo de 2017), la base de datos de Olson está disponible en IANA; consulte https://iana.org/ zonas horarias y ftp://ftp.iana.org/tz (especialmente < a href = "ftp://ftp.iana.org/tz/releases" rel = "nofollow noreferrer"> ftp://ftp.iana.org/tz/releases ).

También está el repositorio de datos de configuración regional común CLDR que también tiene información sobre las zonas horarias.

El DBMS de Oracle maneja esto automáticamente por usted. La fecha se almacena en una representación interna (imaginemos UMT por el bien del argumento) y se formatea de acuerdo con las reglas de la zona horaria cuando se convierte en una cadena.

Esto también resuelve el argumento sobre qué hacer durante el cambio a lo largo del tiempo. ES DECIR. cuando hace retroceder el reloj 1/2 hora, en realidad hay 2 instancias de 3:25 a.m. en el mismo día.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top