Compartilhar 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 dá suporte ao trabalho com o fuso horário local e o UTC (Tempo Universal Coordenado). A TimeZoneInfo classe dá suporte a essas duas zonas, bem como a qualquer fuso horário sobre quais 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.

Itens essenciais de fuso horário

Um fuso horário é uma região geográfica na qual o mesmo horário é usado. Normalmente, mas nem sempre, os fusos horários adjacentes têm uma hora de diferença. O tempo em qualquer um dos fusos horários do mundo pode ser expresso como um deslocamento do UTC (Tempo Universal Coordenado).

Muitos dos fusos horários mundiais dão suporte ao horário de verão. O horário de verão tenta maximizar as horas de luz do dia adiantando o relógio em uma hora na primavera ou no início do verão e voltando ao horário normal (ou padrão) no final do verão ou outono. Essas alterações de e para o horário padrão são conhecidas como regras de ajuste.

A transição de e para o horário de verão em um fuso horário específico 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 padrão 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 semana específica de um mês específico 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 dão suporte a regras de ajuste, a transição de e para o horário de verão cria dois tipos de horários anômalos: tempos inválidos e horários ambíguos. Uma hora inválida é um tempo inexistente criado pela transição do horário padrão para o horário de verão. Por exemplo, se essa transição ocorrer em um dia específico às 2:00 da manhã e fizer com que o tempo seja alterado para 3:00 da manhã, cada intervalo de tempo entre 2:00 e 2:59:59 da manhã é inválido. Um horário ambíguo é um horário que pode ser mapeado para duas vezes 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 dia específico às 2:00 da manhã e fizer com que o tempo seja alterado para 1:00 da manhã, cada intervalo de tempo entre 1:00 e 1:59:59 da manhã pode ser interpretado como uma hora 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 com reconhecimento de fuso horário.

Prazo Definição
Regra de ajuste 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 pela qual o tempo padrão muda como resultado da aplicação da regra de ajuste) e informações sobre a data e hora específicas que as transições devem ocorrer durante o período de ajuste. As transições podem seguir uma regra fixa ou uma regra flutuante.
Horário ambíguo Um horário que pode ser mapeado para dois horários distintos em um único fuso horário. Ocorre quando o horário do relógio é atrasado, como durante a transição do horário de verão de um fuso horário para seu horário padrão. Por exemplo, se essa transição ocorrer em um dia específico às 2:00 da manhã e fizer com que o tempo seja alterado para 1:00 da manhã, cada intervalo de tempo entre 1:00 e 1:59:59 da manhã pode ser interpretado como uma hora 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 padrão 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 determinada semana de um mês específico 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.
Horário inválido Um tempo inexistente que é um artefato da transição do horário padrão para o horário de verão. Ocorre quando o horário do relógio é ajustado para frente no tempo, como durante a transição do horário padrão de um fuso horário para o horário de verão. Por exemplo, se essa transição ocorrer em um dia específico às 2:00 da manhã e fizer com que o tempo seja alterado para 3:00 da manhã, cada intervalo de tempo entre 2:00 e 2:59:59 da manhã é inválido.
Tempo de transição Informações sobre uma alteração de horário específica, como a alteração 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 determinado período de tempo. (Para fusos horários que não dão suporte ao horário de verão, o método retorna uma matriz vazia.) Cada TimeZoneInfo.AdjustmentRule objeto tem uma propriedade DaylightTransitionStart e uma propriedade DaylightTransitionEnd que definem a data e hora específica da transição para e do horário de verão. A IsFixedDateRule propriedade indica se essa transição é fixa ou flutuante.

O .NET depende das 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. Por fim, o registro 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 dá 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 que dão suporte ao horário de verão tem apenas uma ou duas regras de ajuste predefinidas.

A dependência da TimeZoneInfo classe no registro significa que um aplicativo com reconhecimento de fuso horário não pode ter certeza de que um fuso horário específico 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 UTC) deve usar o tratamento de exceção. 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 ToSerializedString método para converter um fuso 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 inserido e como restaurar fusos horários de um recurso inserido.

Como cada fuso horário é caracterizado por um deslocamento base em relação ao UTC, bem como por um deslocamento 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 essa finalidade, o TimeZoneInfo objeto inclui vários métodos de conversão, incluindo:

  • ConvertTimeFromUtc, que converte UTC no horário de um fuso horário designado.

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

  • ConvertTime, que converte a hora 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 TimeZoneInfo objetos) como parâmetros para converter a hora em um fuso horário designado para o horário em outro fuso horário designado.

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

Consulte também