Partilhar via


Visão geral do fuso horário

A TimeZoneInfo classe simplifica a criação de aplicativos com reconhecimento de fuso horário. A TimeZone classe suporta trabalhar com o fuso horário local e o Tempo Universal Coordenado (UTC). A TimeZoneInfo classe suporta ambas as zonas, bem como qualquer fuso horário sobre o qual as informações são predefinidas no registro. Você também pode usar TimeZoneInfo para definir fusos horários personalizados sobre os quais o sistema não tem informações.

Essencial de fuso horário

Um fuso horário é uma região geográfica na qual a mesma hora é usada. Normalmente, mas nem sempre, os fusos horários adjacentes estão separados por uma hora. A hora em qualquer um dos fusos horários do mundo pode ser expressa como um deslocamento do Tempo Universal Coordenado (UTC).

Muitos dos fusos horários do mundo suportam o horário de verão. O horário de verão tenta maximizar as horas de luz do dia, adiantando o tempo em uma hora na primavera ou no início do verão e retornando ao horário normal (ou padrão) no final do verão ou outono. Estas alterações de e para a hora legal são conhecidas como regras de ajustamento.

A transição de e para o horário de verão em um determinado fuso horário pode ser definida por uma regra de ajuste fixa ou flutuante. Uma regra de ajuste fixa define uma data específica na qual a transição de ou para o horário de verão ocorre a cada ano. Por exemplo, uma transição do horário de verão para o horário legal que ocorre todos os anos em 25 de outubro segue uma regra de ajuste fixa. Muito mais comuns são as regras de ajuste flutuante, que definem um dia específico de uma determinada semana de um determinado mês para a transição de ou para o horário de verão. Por exemplo, uma transição 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 fusos horários que suportam regras de ajuste, a transição de e para o horário de verão cria dois tipos de horários anômalos: horários inválidos e horários ambíguos. Uma hora inválida é uma hora inexistente criada pela transição da hora padrão para a hora de verão. Por exemplo, se essa transição ocorrer em um determinado dia às 2h00 e fizer com que o horário mude para 3h00, cada intervalo de tempo entre 2h00 e 2h5959 é inválido. Uma hora ambígua é uma hora que pode ser mapeada para duas horas diferentes em um único fuso horário. Ele é criado pela transição do horário de verão para o horário padrão. Por exemplo, se essa transição ocorrer em um determinado dia às 2h00 e fizer com que o horário mude para 1h00, cada intervalo de tempo entre 1h00 e 1h59h59 pode ser interpretado como um horário padrão ou um horário de verão.

Terminologia de fuso horário

A tabela a seguir define termos comumente usados ao trabalhar com fusos horários e desenvolver aplicativos com reconhecimento de fuso horário.

Termo Definição
Regra de ajustamento Uma regra que define quando ocorre a transição do horário padrão para o horário de verão e de volta do horário de verão para o horário padrão. Cada regra de ajuste tem uma data de início e de término que define quando a regra está em vigor (por exemplo, a regra de ajuste está em vigor de 1º de janeiro de 1986 a 31 de dezembro de 2006), um delta (a quantidade de tempo em que a hora padrão muda 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. As transições podem seguir uma regra fixa ou uma regra flutuante.
Tempo ambíguo Uma hora que pode ser mapeada para duas horas diferentes em um único fuso horário. Ocorre quando a hora do relógio é ajustada de volta no tempo, como durante a transição do horário de verão de um fuso horário de verão para seu horário padrão. Por exemplo, se essa transição ocorrer em um determinado dia às 2h00 e fizer com que o horário mude para 1h00, cada intervalo de tempo entre 1h00 e 1h59h59 pode ser interpretado como um horário 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 de ou para o horário de verão. Por exemplo, uma transição do horário de verão para o horário legal que ocorre todos os anos em 25 de outubro segue uma regra de ajuste fixa.
Regra flutuante Uma regra de ajuste que define um dia específico de uma semana específica de um determinado mês para a transição de ou para o horário de verão. Por exemplo, uma transição 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.
Tempo inválido Um horário inexistente que é um artefato da transição do horário padrão para o horário de verão. Ocorre quando a hora do relógio é ajustada para a frente no tempo, como durante a transição da hora padrão de um fuso horário para o horário de verão. Por exemplo, se essa transição ocorrer em um determinado dia às 2h00 e fizer com que o horário mude para 3h00, cada intervalo de tempo entre 2h00 e 2h5959 é inválido.
Tempo de transição Informações sobre uma alteração de hora específica, como a mudança do horário de verão para o horário padrão ou vice-versa, em um fuso horário específico.

Fusos horários e a classe TimeZoneInfo

No .NET, um TimeZoneInfo objeto representa um fuso horário. A TimeZoneInfo classe inclui um GetAdjustmentRules método que retorna uma matriz de TimeZoneInfo.AdjustmentRule objetos. Cada elemento dessa matriz fornece informações sobre a transição de e para o horário de verão para um período de tempo específico. (Para fusos horários que não suportam o horário de verão, o método retorna uma matriz vazia.) Cada TimeZoneInfo.AdjustmentRule objeto tem uma DaylightTransitionStart e uma DaylightTransitionEnd propriedade que define a data e a hora específicas da transição de e para o horário de verão. A IsFixedDateRule propriedade indica se essa transição é fixa ou flutuante.

O .NET depende de informações de fuso horário fornecidas pelo 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, como o registro é uma estrutura dinâmica, fusos horários predefinidos podem ser adicionados ou removidos dele. Finalmente, o registo não contém necessariamente dados históricos de fuso horário. Por exemplo, no Windows XP, o registro contém dados sobre apenas um único conjunto de ajustes de fuso horário. O Windows Vista oferece suporte a dados dinâmicos de fuso horário, 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 definidos no registro do Windows Vista e oferecem suporte ao horário de verão têm apenas uma ou duas regras de ajuste predefinidas.

A dependência da classe no registro significa que um aplicativo com reconhecimento de fuso horário não pode ter certeza de TimeZoneInfo que um determinado fuso horário está definido no registro. Como resultado, a tentativa de instanciar um fuso horário específico (diferente do fuso horário local ou do fuso horário que representa o UTC) deve usar o tratamento de exceções. Ele também deve fornecer algum método de permitir que o aplicativo continue se um objeto necessário TimeZoneInfo não puder ser instanciado do registro.

Para lidar com a ausência de um fuso horário necessário, a TimeZoneInfo classe inclui um CreateCustomTimeZone método, que você pode usar para criar fusos horários personalizados que não são encontrados no registro. Para obter detalhes sobre como criar um fuso horário personalizado, consulte Como criar fusos horários sem regras de ajuste e Como criar fusos horários com regras de ajuste. Além disso, você pode usar o método para converter um fuso ToSerializedString horário recém-criado em uma cadeia de caracteres e salvá-lo em um armazenamento de dados (como um banco de dados, um arquivo de texto, o registro ou um recurso de aplicativo). Em seguida, você pode usar o FromSerializedString método para converter essa cadeia de caracteres de volta em um TimeZoneInfo objeto. Para obter detalhes, consulte Como salvar fusos horários em um recurso incorporado e Como restaurar fusos horários a partir de um recurso incorporado.

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 facilmente convertido para o horário em outro fuso horário. Para este efeito, o TimeZoneInfo objeto inclui vários métodos de conversão, incluindo:

  • ConvertTimeFromUtc, que converte UTC para a hora em um fuso horário designado.

  • ConvertTimeToUtc, que converte a hora em um fuso horário designado para UTC.

  • ConvertTime, que converte a hora em um fuso horário designado para a hora em outro fuso horário designado.

  • ConvertTimeBySystemTimeZoneId, que usa identificadores de fuso horário (em vez de TimeZoneInfo objetos) como parâmetros para converter a hora em um fuso horário designado para a hora em outro fuso horário designado.

Para obter detalhes sobre como converter horários entre fusos horários, consulte Convertendo horários entre fusos horários.

Consulte também