Visão geral do fuso horário
A classe TimeZoneInfo simplifica a criação de aplicativos com reconhecimento de fuso horário. A classe TimeZone dá suporte ao trabalho com o fuso horário local e o UTC (Tempo Universal Coordenado). A classe TimeZoneInfo dá suporte a esses dois fusos horários, bem como a qualquer fuso horário sobre quais informações são predefinidas no registro. Você também pode usar a TimeZoneInfo para definir fusos horários personalizados dos quais o sistema não tenha nenhuma informação.
Fundamentos sobre 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 diferem em uma hora. A hora em cada um dos fusos horários do mundo pode ser expressa como uma diferença 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 do dia com sol 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 de/para o horário padrão são conhecidas como regras de ajuste.
A transição de/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/para o horário de verão ocorre todos os anos. 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/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 os fusos horários que oferecem suporte às regras de ajuste, a transição de/para o horário de verão cria dois tipos de horários anômalos: horários inválidos e horários ambíguos. Um horário inválido é um horário 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 a hora seja alterada para 3:00 da manhã, cada intervalo de tempo entre 2:00 e 2:59:59 da manhã será inválido. Um horário ambíguo é aquele que pode ser mapeado para dois horários 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 a hora seja alterada para 1:00, cada intervalo de tempo entre 1:00 e 1:59:59 da manhã poderá ser interpretado como uma hora padrão ou horário de verão.
Terminologia de fuso horário
A tabela a seguir define os termos que geralmente são usados ao trabalhar com fusos horários e ao desenvolver aplicativos com reconhecimento de fuso horário.
Termo | 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 o retorno do horário de verão para o horário padrão. Cada regra de ajuste tem uma data de início e uma data de término que definem 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 (o período de tempo de mudança do horário padrão como resultado da aplicação da regra de ajuste) e informações sobre a data e a 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. |
Horário ambíguo | Um horário que pode ser mapeado para dois horários diferentes 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 a hora seja alterada para 1:00, cada intervalo de tempo entre 1:00 e 1:59:59 da manhã poderá ser interpretado como uma hora padrão ou horário de verão. |
Regra fixa | Uma regra de ajuste que define uma data específica para a transição de/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 semana específica de um mês específico para a transição de/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 horário 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 é adiantado, como durante a transição do horário padrão de um fuso horário para seu 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 a hora seja alterada para 3:00 da manhã, cada intervalo de tempo entre 2:00 e 2:59:59 da manhã será inválido. |
Horário de transição | Informações sobre uma mudança de horário específica, como a mudança 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, 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 de e para o horário de verão para um determinado período. (Para fusos horários que não dão suporte ao 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 a hora específicas da transição de e para o horário de verão. A propriedade IsFixedDateRule 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 são representados no registro. Além disso, como o registro é uma estrutura dinâmica, os 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 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 só 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 classe TimeZoneInfo no Registro significa que um aplicativo com reconhecimento de fuso horário não pode ter certeza de que um determinado fuso horário está definido no Registro. Como resultado, a tentativa de criar uma instância de um fuso horário específico (que não seja o fuso horário local ou o fuso horário que representa o UTC) deve usar tratamento de exceção. Ela também deve fornecer algum método para permitir que o aplicativo continue caso não seja possível criar uma instância de um objeto TimeZoneInfo obrigatório por meio do Registro.
Para lidar com 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 detalhes sobre como criar um fuso horário personalizado, confira 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 ToSerializedString para converter um fuso horário que acaba de ser 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 método FromSerializedString para converter essa cadeia de caracteres de volta em um objeto TimeZoneInfo. Para detalhes, confira 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 uma diferença base do UTC, bem como por uma diferença do UTC que reflete as regras de ajuste existentes, um horário em um fuso horário pode ser facilmente convertido no horário em outro fuso horário. Para essa finalidade, o objeto TimeZoneInfo inclui vários métodos de conversão, como:
ConvertTimeFromUtc, que converte UTC na 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 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 a hora em um fuso horário designado para o horário em outro fuso horário designado.
Para obter detalhes de como converter horários entre fusos horários, consulte Convertendo horários entre fusos horários.