Qual é a melhor prática para salvar fusos horários no banco de dados?

12

Queremos começar a coletar fusos horários para cada um de nossos endereços no banco de dados. Qual é a melhor prática para armazenar os fusos horários? Como você adquiriu fusos horários para os registros de endereço existentes?

Estou usando o servidor Microsoft SQL, .net mvc, c #. Todas as sugestões serão muito apreciadas.

Rodney
fonte
Entre uma pegada de fuso horário normal, é usar um int, mas alguns fusos horários podem ser de + ou - 30 minutos ou até 15 minutos :) Ah, e lembre-se de que não é uma ciência exata, pois o horário de verão pode desencorajá-lo.
Rocklan
2
O @LachlanB é uma maneira de dizer que o fuso horário é mais um local do que um deslocamento de tempo . Mas mesmo essa visão por si só não é suficiente, por exemplo, a Rússia mudou recentemente sua política em relação ao horário de verão, o que significa que você teria que tratá-la de maneira diferente, dependendo da data real.
Daniel B

Respostas:

7

Você deseja armazenar algo que não muda o tempo todo (ou duas vezes por ano). O banco de dados de fuso horário https://en.wikipedia.org/wiki/List_of_tz_database_time_zones é exatamente a coisa certa. Então você apenas armazena duas letras.

Nesse banco de dados, você pode consultar o deslocamento da hora e quando o horário de verão está ativo. Não é apenas o deslocamento de tempo, também fornece uma área; muitos lugares na mesma latitude terão códigos diferentes e podem alterar individualmente suas regras de fuso horário, e seu software poderá lidar com isso.

O único momento em que você precisa fazer alterações em seu banco de dados é quando um local muda a qual fuso horário pertence, o que seria muito raro.

gnasher729
fonte
Observe que a lista na wikipedia não contém abreviações de 2 caracteres para todos os fusos horários da IANA - além do mapeamento não ser inequívoco. Se você precisar de informações históricas completas, procure os nomes completos.
Hulk
2
Os únicos dois códigos de letras que vejo na página da Wikipedia são os códigos dos países. Estes não definem exclusivamente fusos horários. Por exemplo, todos os fusos horários nos EUA têm o mesmo código de país com duas letras: EUA. Da mesma forma, em toda a Austrália há o código de país AU.
Ian Ian
3

A melhor prática absoluta seria usar um banco de dados que suporte o TIMESTAMP WITH TIMEZONEtipo de dados definido pelo SQL99.

O SQL Server tem um tipo chamado datetimeoffsetque faz tudo o que TIMESTAMP WITH TIMEZONEpode, exceto armazenar o fuso horário real. Tudo o que você pode fazer é armazenar um deslocamento do UTC (por exemplo, 2013-05-04 12:34:56 -5:00), o que significa que você precisará determinar isso antes do armazenamento com base no fuso horário.

Blrfl
fonte
3

Supondo que você esteja usando .Net framework 4.0 ou superior, TimeZoneInfo é o que você precisa.

Armazene todos os valores de data no banco de dados no formato UTC. Use o valor do ID ou o resultado de ToSerializedString () para cada cliente para criar um objeto TimeZoneInfo para converter datas armazenadas em formato local para exibição.

Peregrino
fonte
2

Você disse que deseja armazenar um fuso horário para cada endereço no seu banco de dados, mas não disse o que deseja fazer com ele. Armazenar algo em um banco de dados raramente é um fim em si.

De qualquer forma, eu usaria o banco de dados TZ , também conhecido como banco de dados Olsen, diretamente ou usando algum software de prateleira que integra o TZ. Você pode armazenar um fuso horário simplesmente como uma string para se referir a uma das entradas do TZ DB , por exemplo, 'Africa / Kampala' ou 'Europe / Paris'.

bdsl
fonte