Quando trabalhamos com aplicativos web, não sabemos onde esse aplicativo ficará hospedado, e nem por quanto tempo. As aplicações podem mudar ao sabor dos ventos, pra onde estes sopram as nuvens.
A nuvem trouxe muitas facilidades e alguns desafios. Trabalhar com datas sempre foi um desafio, independente do sistema e localização. Por exemplo, o simples fato de saber que hora o registro foi visto, alterado, inserido ou excluído (um CRUD) pode trazer boa maratona de ifs e elses, para identificar fuso horário de origem da ação e fuso horário de visualização.
Boa parte dos desenvolvedores optam por trabalhar com o padrão UTC (Coordinated Universal Time), substituto do padrão ‘Greenwich’. Este usa como referência o relógio atômico e é ajustado conforme necessário. Para executar uma ação, fica bem simples determinar seu horário. Mas para visualizar esse horário, entram vários cálculos de conversão. Muitas bibliotecas foram criadas para facilitar essa conversão.
O que estou trazendo nessa sugestão de código é trabalhar exclusivamente com o horário de Brasília. Sim, esta abordagem só servirá para aplicações nacionais, mas terá a vantagem de ser hospedada ou alocada em qualquer local do mundo. Outra vantagem é que se for preciso exportar alguma tabela com horários (para o Excel ou Access, por exemplo), não haverá necessidade de pensar na conversão.
Como o código usa uma biblioteca do Windows, o próprio sistema operacional faz as operações e cálculos para atribuir a data e hora relativos ao fuso horário indicado. Se o país mudar a regra, a atualização do SO já tratará essa mudança. Nada no código precisará ser feito. A desvantagem dessa abordagem é a de que o SO precisará estar atualizado.
using System; namespace Yordi.Ferramentas.Data { public static class DataPadrao { /// <summary> /// Mesmo estando o servidor configurado para qualquer fuso horário, obtém-se o horário de Brasília /// </summary> /// <returns></returns> public static DateTime Brasilia { get { DateTime timeUtc = DateTime.UtcNow; try { TimeZoneInfo kstZone = TimeZoneInfo.FindSystemTimeZoneById("E. South America Standard Time"); // Brasilia/BRA DateTime dateTimeBrasilia = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, kstZone); return dateTimeBrasilia; } catch { return timeUtc; } } } public static string DataBrasiliaToMSSQL { get { return string.Format("{0} {1:g}", Brasilia.ToString("yyyyMMdd"), Brasilia.TimeOfDay); } } /// <summary> /// Para corresponder a Data mínima no MySQL /// new DateTime(1900, 1, 1) /// </summary> public static DateTime MinValue { get { return new DateTime(1900, 1, 1); } } } } |
A forma de usar ficará simples. Basta escrever o código:
using Yordi.Ferramentas.Data; DateTime data = DataPadrao.Brasilia; |
A vantagem de usar o UTC é que não dependerá de políticas dos diversos países ou nações, não necessita de regulação relativa a horas de inverno e verão.