Visão geral do fuso horário
A classe TimeZoneInfo simplifica a criação de aplicativos sensíveis ao fuso horário.A classe TimeZone suporta trabalhar com o fuso horário local e com o Tempo Universal Coordenado (UTC).A classe TimeZoneInfo suporta ambos esses fusos, bem como qualquer fuso horário cujas informações sejam predefinidas no registro.Você também pode usar TimeZoneInfo para definir fusos horário personalizados sobre os quais o sistema não tenha nenhuma informação.
Conceitos básicos de fuso horário
Um fuso horário é uma região geográfica em que o mesmo horário é usado.Normalmente, mas não sempre, fusos horários adjacentes diferem de uma hora.O horário em qualquer um dos fusos horários do mundo pode ser expresso como um deslocamento a partir do Tempo Universal Coordenado (UTC).
Muitos dos fusos horários do mundo permitem horário de verão.O horário de verão tenta maximizar as horas com luz do dia adiantando o horário em uma hora na primavera ou no começo do verão e retornando ao horário normal (ou padrão) no final do verão ou no outono.Essas alterações no horário padrão são conhecidas como regras de ajuste.
A transição para e a partir do horário de verão em um determinado fuso horário pode ser definida por uma regra de ajuste tanto fixa quanto flutuante.Uma regra de ajuste fixa define uma data específica na qual ocorre transição para ou a partir do horário de verão todo ano.Por exemplo, uma transição de horário de verão para a hora padrão que ocorre todo ano em 25 de outubro segue uma regra de Ajuste fixo.Muito mais comuns são as regras de ajuste flutuantes, que definem um dia específico de uma semana específico de um mês específico para a transição para ou a partir do horário de verão.Por exemplo, uma transição a partir do horário padrão para o horário de verão que ocorre no terceiro domingo de março segue uma regra de ajuste flutuante.
Para time zonas que oferecem suporte a regras de ajuste, a transição para e de verão time cria dois tipos de anormais time s: inválido horas e horas em ambíguas.Um horário inválido é um horário inexistente criado pela transição da hora padrão para o horário de verão.Por exemplo, se ocorrer essa transição em um determinado dia, às 2: 00.e faz com que o time de alterar às 3 h, cada intervalo de time entre 14 he 2:59:99 A.M.não é válido.Um horário ambíguo é um horário que pode apontar para dois horários diferentes em um único fuso horário.Ele é criado pela transição do horário de verão para a hora padrão.Por exemplo, se ocorrer essa transição em um determinado dia, às 2: 00.and causes the time to change to 1:00 A.M., each time interval between 1:00 A.M.e 01:59:00:99 A.M.pode ser interpretado sistema autônomo uma time padrão ou um horário de verão.
Terminologia de fuso horário
A tabela a seguir define os termos comumente usados ao trabalhar com fusos horários e desenvolver aplicativos sensíveis ao fuso horário.
Termo |
Definição |
---|---|
Regra de ajuste |
Uma regra que define quando ocorre a transição da hora padrão para o horário de verão e volta do horário de verão para o horário padrão.Cada regra de ajuste possui uma data de início e término que define quando a regra está ativa (por exemplo, a regra de ajuste está ativa desde 1 de janeiro de 1986 até 31 de dezembro de 2006), um delta (o período de tempo pelo qual o horário padrão é alterado como resultado da aplicação da regra de ajuste) e informações sobre a data e hora específicas em que as transições devem ocorrer durante o período de ajuste.Transições podem seguir tanto uma regra fixa quanto uma regra flutuante. |
Horário ambíguo |
Um horário ambíguo é um horário que pode apontar para dois horários diferentes em um único fuso horário.Ele ocorre quando a hora do relógio é atrasada, como durante a transição do horário de verão para o horário padrão de um fuso horário.Por exemplo, se ocorrer essa transição em um determinado dia, às 2: 00.and causes the time to change to 1:00 A.M., each time interval between 1:00 A.M.e 01:59:00:99 A.M.pode ser interpretado sistema autônomo uma time padrão ou um horário de verão. |
Regra fixa |
Uma regra de ajuste que define uma data específica para a transição para ou a partir do horário de verão.Por exemplo, uma transição de horário de verão para a hora padrão que ocorre todo ano em 25 de outubro segue uma regra de Ajuste fixo. |
Regra flutuante |
Uma regra de ajuste que define um dia específico de uma semana específica de um mês específico para a transição para ou a partir do horário de verão.Por exemplo, uma transição a partir do horário padrão para o horário de verão que ocorre no terceiro domingo de março segue uma regra de ajuste flutuante. |
Horário inválido |
Um horário inexistente que é um produto da transição da hora padrão para o horário de verão.Ele ocorre quando a hora do relógio é atrasada, como durante a transição do horário de verão para o horário padrão de um fuso horário.Por exemplo, se ocorrer essa transição em um determinado dia, às 2: 00.e faz com que o time de alterar às 3 h, cada intervalo de time entre 14 he 2:59:99 A.M.não é válido. |
Horário de transição |
Informações sobre uma mudança de horário específica, tais como a alteração do horário de verão para o horário padrão ou vice-versa, em um determinado fuso horário. |
Fusos horários e a classe TimeZoneInfo
No .NET Framework, um objeto TimeZoneInfo representa um fuso horário.A classe TimeZoneInfo inclui um método GetAdjustmentRules que retorna uma matriz de objetos TimeZoneInfo.AdjustmentRule.Cada elemento dessa matriz fornece informações sobre a transição para e partir do horário de verão para um período de tempo específico.(Para fusos horários que não permitem horário de verão, o método retorna uma matriz vazia.) Cada objeto TimeZoneInfo.AdjustmentRule tem uma propriedade DaylightTransitionStart e uma propriedade DaylightTransitionEnd que define a data e hora específicas da transição para e partir do horário de verão.A propriedade IsFixedDateRule indica se essa transição é fixa ou flutuante.
O .NET Framework depende de informações do fuso horário fornecidas pela sistema operacional Windows e armazenadas no registro.Devido ao número de fusos horários da Terra, nem todos os fusos horários existentes são representados no Registro.Além disso, devido ao registro ser uma estrutura dinâmica, fusos horários predefinidos podem ser adicionados ou removidos dele.Finalmente, o registro não necessariamente contém dados históricos de fusos horários.Por exemplo, no Windows XP o registro contém dados sobre apenas um único conjunto de ajustes de fuso horário.O Windows Vista suporta dados dinâmicos de fusos horários, o que significa que um único fuso horário pode ter várias regras de ajuste que se aplicam a intervalos específicos de anos.No entanto, a maioria dos fusos horários que são definidos no horário de verão do registro do Windows Vista e que suportam horário de verão tem somente uma ou duas regra de ajuste predefinidas.
A dependência da classe TimeZoneInfo no registro significa que um aplicativo sensível ao fuso horário não pode garantir que um determinado fuso horário esteja definido no registro.Como resultado, a tentativa de instanciar um fuso horário específico (que não o fuso horário local ou o fuso horário que representa o UTC) deve usar manipulação de exceção.Ela também deve fornecer algum método de permitir que o aplicativo continue se um objeto TimeZoneInfo necessário não puder ser instanciado a partir do Registro.
Para manipular a ausência de um fuso horário necessário, a classe TimeZoneInfo inclui um método CreateCustomTimeZone, que você pode usar para criar fusos horários personalizados que não são encontrados no registro.Para obter detalhes sobre a criação de um fuso horário personalizado, consulte Como: Criar zonas time sem regras de ajuste e Como: Criar fusos horários com regras de ajuste.Além disso, você pode usar o método ToSerializedString para converter um fuso horário recém-criado em uma sequência de caracteres e salvá-la em um armazenamento de dados (tal como um banco de dados, um arquivo de texto, o registro ou um recurso de aplicativo).Você pode, então, usar o método FromSerializedString para converter essa sequência de caracteres de volta em um objeto TimeZoneInfo.Para obter detalhes, consulte Como: Salvar time regiões para um recurso inserido e Como: restauração time zonas a partir de um recurso inserido.
Como cada fuso horário é caracterizado por um deslocamento base do UTC, bem como por um deslocamento do UTC que reflete quaisquer regras de ajuste existentes, um horário em um fuso horário pode ser convertido facilmente para o horário em outro fuso horário.Para isso, o objeto TimeZoneInfo inclui vários métodos de conversão, incluindo:
ConvertTimeFromUtc, que converte o UTC para o horário em um fuso horário designado.
ConvertTimeToUtc, que converte o UTC para o horário em um fuso horário designado.
ConvertTime, que converte o horário em um fuso horário designado para o horário em outro fuso horário designado.
ConvertTimeBySystemTimeZoneId, que usa identificadores de fuso horário (em vez de objetos TimeZoneInfo) como parâmetros para converter o horário em um fuso horário designado para o horário em outro fuso horário designado.
Para obter detalhes sobre converter horários entre fusos horários, consulte Convertendo Horários entre Zonas de Tempo.