Pergunta

Armazenar tudo em GMT?

Armazenar tudo do jeito que foi inserido com um deslocamento incorporado?

Faça as contas sempre que renderizar?

Exibir tempos relativos "1 minuto atrás"?

Foi útil?

Solução

Você tem que armazenar em UTC - se você não fizer isso, seu relato histórico e comportamento durante coisas como Daylight Savings vai ... engraçado. GMT é um tempo local, sujeito a horário de verão em relação ao UTC (que não é).

Apresentação de usuários em diferentes fusos horários pode ser um verdadeiro bastardo se você está armazenando hora local. É fácil de ajustar para local se seus dados crus é em UTC - basta adicionar do seu usuário offset e você é feito

Joel falou sobre isso em um dos podcasts (em uma rotunda maneira) - disse a armazenar seus dados na maior resolução possível (procurar 'fidelidade'), porque você sempre pode munge-lo quando ele sai novamente. É por isso que eu digo armazená-lo como UTC, como hora local você precisa ajustar para quem não está nesse fuso horário, e isso é um monte de trabalho duro. E você precisa para armazenar se, por exemplo, o horário de verão estava em vigor quando você armazenou o tempo. Yuk.

Muitas vezes, em bases de dados no passado eu armazenados dois - UTC para a classificação, hora local para exibição. Dessa forma, nem o usuário nem o computador ficar confuso.

Agora, como para exibir: Claro, você pode fazer o "3 minutos atrás" coisa, mas só se você armazenar UTC - caso contrário, os dados inseridos em diferentes fusos horários vai fazer coisas como a exposição como "-4 horas há" , que vai irritar os outros. Se você estiver indo para exibir um tempo real, as pessoas gostam de tê-lo em sua hora local -. E se os dados está sendo introduzida em múltiplos fusos horários que você só pode fazer isso com facilidade se você está armazenando UTC

Outras dicas

A resposta, como sempre, é "depende".

Depende do que você está descrevendo, com o tempo, e como os dados foram fornecidos a você. A chave para decidir a forma de armazenar valores de tempo é decidir se você está perdendo informações, largando o fuso horário, bem como não surpreende seus usuários.

Existem vantagens concretas em armazenar dados em um time_t UTC - é um único int, permitindo triagem rápida e fácil armazenamento

.

Eu vejo o problema como sendo dividido em áreas específicas:

  1. Dados Históricos
  2. Future, Short Term dados
  3. Future, Long Term dados

Com as seguintes subclasses em cada:

  1. sistema previsto
  2. usuário fornecido

Vamos olhar-los um de cada vez.

sistema previsto :. Eu recomendaria sistemas funcionando em UTC, então você evitar o problema de fuso horário e, novamente, sem perda de informação é vista (é sempre UTC)

Dados Históricos : Estas são coisas como arquivos de log do sistema, estatísticas de processos, rastreamento, datas de comentário / horários, etc. Os dados não vai mudar, eo descritor de fuso horário não vai para mudar de forma retroativa. Para este tipo de dados, não há informações perdidas, armazenando as informações em UTC, independentemente do fuso horário que foi fornecido. Então, largar o fuso horário.

Future, Long Term Dados : Estes são eventos que são ou longe o suficiente no futuro ou vai continuar acontecendo. Se forem mantidos por tempo suficiente, os descritores de fuso horário são garantidos mudança. Um bom exemplo deste tipo de dados é, "O Encontro de Gestão Weekly". Estes são dados que são inseridos uma vez e esperados para continuar trabalhando em perpetuidade. Para estes valores, é importante para determinar se ele é do sistema ou do usuário fornecido. Para os dados fornecidos pelo usuário, o tempo deve ser armazenado com fuso horário do criador, qualquer outra coisa que resulta em perda de informações. Esta perda de informação se torna aparente quando a definição fuso horário muda eo tempo é exibido para o criador como tendo um valor completamente diferente!

Como Bwooce indicou, há alguma confusão, onde o criador e espectador estão em diferentes fusos horários. Nesse caso, eu esperaria que o aplicativo para indicar que valores de tempo mudaram devido a uma mudança de fuso horário de seus locais anteriores.

Future, Short Term Dados : Este é um dado que está indo rapidamente para se tornar histórica, ou é válida apenas por um curto período de tempo. Os exemplos poderiam ser temporizadores de intervalo, transições de rating, etc. Para esses dados, uma vez que a probabilidade é baixa que a definição vai mudar entre a criação do valor e do tempo torna-se histórico, pode ser possível para fugir com deixar cair o fuso horário. No entanto, eu descobri que estes valores têm o mau hábito de se tornar "Future, dados a longo prazo".

Depois de ter decidido para armazenar o fuso horário, é preciso ter cuidado com a forma como ele é armazenado.

  • Não guarde o fuso horário como uma compensação, ou o descritor completo.

Se você armazenar um fuso horário como compensação, o que você faz se as mudanças de fuso horário? Você atravessa o sistema e fazer uma mudança cobertor sobre os dados existentes? Se fizer isso, você já fez quaisquer valores históricos incorreta. Bons exemplos disso são culpa Oracle e iCal. A Oracle armazena informações fuso horário como um deslocamento do UTC, e iCal inclui o descritor completo para o fuso horário criação.

  • Do armazená-lo como um nome.

Isto permite a definição de fuso horário para a mudança sem ter que modificar os valores existentes que você tem. Faz triagem mais difícil, uma vez que qualquer índice que é gerado pode ser considerada válida se as alterações de dados fuso horário.

Se os desenvolvedores continuam a loja de tudo em UTC, independentemente do fuso horário, vamos continuar a ver os problemas que vimos com o último lote de mudanças de fuso horário.

Em uma organização, a secretaries teve que imprimir os calendários para suas equipes antes da data economias luz do dia, e, em seguida, imprimi-los novamente após a mudança. Finalmente, eles compararam os dois e recriado todos os compromissos que haviam se mudado. Claro, eles perderam vários, e havia várias semanas de dor até a antiga data de verão foi alcançado e os tempos tornou-se correta novamente.

Josh é completamente correta acima, mas eu tenho uma ressalva sutil para explicar. Este é um caso sem resposta correta sobre eventos futuros e fusos horários.

Considere o caso de um compromisso repetido. Ela ocorre em GMT 0000 (para simplificar), que é de 1200 BRT (Horário padrão Nova Zelândia) e 1000 AEST em Sydney, Austrália.

Quando Daylight Savings entra em vigor em uma zona, o que deve ocorrer para a nomeação? Deve-lo:

1a. Se a mudança TZ está na zona de "Dono" do compromisso (que Reservado) em seguida, tentar permanecer em a hora do relógio mesma mesa (por exemplo 10:00)?
1b. Se o mudança TZ está em um dos outros reunião zonas do participante então não mudança

Conseqüências: Ele se move para todos os outros, de forma inesperada, devido à a mudança de proprietários TZ, mas estadias "A reunião 10:00", tanto quanto o proprietário está em causa.

«2. Como acima, mas em sentido inverso.

Conseqüências: Ele se move para o proprietário da reunião (a reunião 10:00 torna-se a reunião 09:00, ou v / v), o que pode ser esperado, mas inconveniente. Ele permanece, ao mesmo tempo relógio de mesa para os outros participantes até que eles passam por sua própria transição TZ.

Nem é perfeito. Considere o caso de dois compromissos, um reservado por pessoa A, que ocorre às 10h, hora local, o outro reservado por pessoa B com a pessoa A como um participante que ocorre às 9h. Se a pessoa A e B Pessoa estão em seguida, uma mudança DST diferente do TZ poderia facilmente levá-los a tornar-se duplo reservado.

Se a sua mente é um pouco curvado, neste ponto, então eu entendo muito bem.

O ponto atrás neste exemplo é que para fazer qualquer um desses comportamentos corretamente você precisa saber não apenas a versão UTC da hora local, mas o TZ (e não o offset) que o proprietário estava quando eles reservado. Caso contrário, você não tem escolha a não ser tomar a opção 2, em silêncio, sem sequer informar qualquer um que as coisas mudaram desde os tempos GMT não mudam e apenas as alterações de apresentação ... certo? (Não, essa é a armadilha, apresentação importa quando a sua reunião das 10h se move por si só)

Eu tenho que creditar o meu colega e amigo Jason Pollock para este insight. Leia sua opinião aqui , eo follow-up discutir iCal e VTIMEZONE aqui.

Armazenando tudo em GMT / UTC parece mais lógico para mim. Você pode, então, mostrar a data e hora em cada fuso horário que deseja.

Alguns ceveats:

  1. Se um tempo só é especificado como um parede relógio e que é a representação que conduz, em seguida, é não um tempo absolutamente especificado. Você deve (e não pode) convertê-lo em qualquer representação GMT. POR EXEMPLO. 09:00 AM todas as manhãs. Em outras palavras: isso não é (data) tempo.
  2. Se você salvar uma data e hora de um futuro nomeação, você deve usar o deslocamento para GMT especificado pela entrada fuso horário e o o momento no tempo -se . Então, se é um compromisso no verão feita no inverno em e.g. europa ocidental, é +2: 00, allthough o (tempo de inverno) Normal offset é +1: 00. Isto irá resolver o problema calendário que Bwooce mencionado.
  3. É claro, o mesmo que se aplica ao uso do direito compensada ao converter para GMT aplica-se ao converter de volta para um data e hora em qualquer particular, fuso horário.

Felizmente, quando usado corretamente, o (NET) DateTime tipo cuida de todos os detalhes de manter calendários etc. para você e tudo isso deve ser muito fácil quando você sabe como ele funciona.

Pessoalmente, eu não posso ver qualquer razão para não armazenar tudo em GMT e depois usar os usuários fuso horário local para exibir o tempo no que se refere a eles.

Se você deseja exibir a hora relativa, obviamente você ainda precisa do tempo e fazer uma tradução, mas se você quiser fazer a tradução Acho GMT ainda é a sua melhor opção.

Então eu corri uma pequena experiência com o servidor MSSQL.

Eu criei uma mesa e acrescentou uma linha com o fuso horário localizada atual (Austrália). Então eu mudei de data e hora para ser GMT e acrescentou outra linha.

Mesmo tho as linhas foram adicionados cerca de 10 segundos de diferença, eles aparecem no servidor SQL como tho eles são 10 horas de intervalo.

Se nada mais, pelo menos, me diz que eu deveria estar armazenando datas de uma forma conisitent, que para mim, adiciona peso ao argumento de armazená-los como GMT.

lojas de MS Dynamics GMT e depois no nível do usuário conhece o seu tempo zona em relação ao GMT. Em seguida, ele exibe itens para você no seu fuso horário.

Apenas pensei que eu ia jogar isso lá fora, já que é um grupo muito grande em MS e é assim que eles decidiram lidar com isso.

i preferem armazenar tudo com o fuso horário. o cliente pode decidir, qual o caminho que deve ser apresentada mais tarde. minha biblioteca favorita para a conversão é o PostgreSQL base de dados .

Dê uma olhada aqui, o W3C tem feito um excelente trabalho de responder à pergunta.

Olhe para os casos de uso.

http://www.w3.org/TR/timezone/

Note que eles recomendam armazenar datetimes como UTC não GMT, GMT está sujeito a horário de verão.

Eu gosto de armazenar em GMT e mostrando apenas relativa ( "cerca de 10 segundos atrás", "5 meses atrás"). Os usuários não precisam ver timestamps reais para a maioria dos casos de uso.

Há certamente exceções, e uma aplicação individual pode ter muitos deles, por isso não pode ser uma resposta 'one-true-way'. Coisas que precisam forte auditoria de capacidade (por exemplo, direito a voto), e os sistemas onde o tempo é parte do domínio do discurso (astronomia, pesquisa científica) pode exigir verdadeiras marcas de tempo para ser mostrado para o usuário.

A maioria dos aplicativos, no entanto, são mais fáceis de entender com um tempo relativo simples.

Eu normalmente só usar o tempo Unix. não necessariamente futuro seguro, mas funciona muito bem.

Guarde sempre em GMT (ou UTC). De lá, ele é fácil de converter para qualquer valor do fuso horário local.

As datas devem ser armazenados como UTC menos que seja usuário forneceu dados e você não pode saber o fuso horário que o usuário pretende que os dados sejam. Às vezes (muito raramente) você precisa apenas armazenar a hora, minuto, segundo, dia, componentes mês e ano, sem qualquer fuso horário para que você pode cuspi-la de volta para o usuário. -Se agora para novos desenvolvedores ou se não tiver certeza, armazenar UTC e você será 99% correto.

Mas não se deixe enganar por acreditar que isso funciona 100% do tempo para todos os casos o tempo todo. Isso não acontece.

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