Pergunta

Eu preciso armazenar o horário de verão (horário de verão) change-over regras para diferentes regiões do mundo em um banco de dados. Eu já tenho uma maneira de armazenar regiões e sub-regiões (assim toda a "metade da Austrália" / problema Arizona / Navajo é cuidado), mas eu estou querendo saber qual o esquema mais eficiente seria para alcançar este objetivo. As duas opções como eu vê-los:

  • tenho uma tabela que contém linha um único para cada ano e região dando as horas de início e fim da hora de Verão, bem como a específica deslocamento
  • Tenha uma tabela que armazena uma fórmula e intervalo de data efetiva para cada região (alcance efetivo necessário para regiões como Israel)

A vantagem para o primeiro é a flexibilidade, uma vez que, literalmente, qualquer é possível. Infelizmente, ele também requer (a) mais espaço, e, correspondentemente, (b) um monte de trabalho para obter a entrada de dados. A segunda é bom porque uma linha poderia corresponder a uma região há décadas, mas também requer algum tipo de analisador de linguagem e intérprete na camada de aplicação. Uma vez que este banco de dados será usado por várias aplicações diferentes escritos em linguagens sem capacidades poderosas de processamento de texto, eu preferia evitar esse caminho.

Eu adoraria zoneinfo uso justo ou algo assim, mas infelizmente isso não é uma opção neste caso. Da mesma forma, não posso normalizar as datas, fuso horário e verão informações em tempo deve estar no banco de dados para satisfazer certos casos de uso.

Alguém tem alguma experiência de fazer algo semelhante? Da mesma forma, alguém tem quaisquer opções brilhantes que eu possa ter perdido?

Foi útil?

Solução

Você está praticamente condenado à primeira opção. Você pode pré-gerar datas como muito à frente como você deseja para países que têm "regras" em relação a mudanças de tempo, mas algumas áreas não têm qualquer regra e as mudanças são promulgadas, quer por decreto ditatorial ou por voto legislativo anualmente (Brasil fez isso até este ano).

É por isso que todos OS vendedores implantação alterações de arquivos fuso horário, uma ou duas vezes por ano -. Eles têm que, porque eles não podem gerar um arquivo de 100% preciso programaticamente

Outras dicas

Se as regras de fuso horário deve estar no banco de dados, eu provavelmente escolheria para atualizá-los automaticamente a partir de uma fonte externa de autoridade (biblioteca, site, qualquer que seja). Manualmente manter regras do horário de verão não parece muito divertido.

Uma das melhores fontes de informação sobre regras de fuso horário é o banco de dados Olson, que estava disponível de elsie.nci.nih.gov . Em setembro de 2008, a versão atual dos dados foi tzdata2008f.tar.gz, a versão atual do código foi tzcode2008e.tar.gz (e sim, o código não foi sempre liberada quando os dados eram). Isso tende a ser a fonte de informação para muitos outros sistemas (incluindo, em particular, as informações do Oracle). Há uma lista de endereços disponíveis, também. Como você pode ver, houve seis versões dos dados até agora em 2008; Tenho cópias de 2005r, 2006l, 2007k à espreita na minha máquina, então as coisas podem mudar com bastante frequência.

Hoje em dia (Março de 2017), o banco de dados Olson está disponível a partir de IANA - veja https://iana.org/ fusos horários e ftp://ftp.iana.org/tz (especialmente < a href = "ftp://ftp.iana.org/tz/releases" rel = "nofollow" noreferrer> ftp://ftp.iana.org/tz/releases ).

Há também o Repositório Locale Comum de dados CLDR que tem informações sobre fusos horários também.

O SGBD Oracle lida automaticamente com isso para você. A data é armazenada em uma representação interna (vamos imaginar UMT por causa do argumento) e é formatado de acordo com as regras do fuso horário quando convertido para uma string.

Isso também resolve o argumento sobre o que fazer durante a mudança ao longo do tempo. OU SEJA quando você voltar o relógio 1/2 hora há realmente 2 casos de 3:25 no mesmo dia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top