Trabalhando com Datas. Um problema que me persegue...

Bha, datas… Este é conserteza o item mais gera problema para a vida de todos… A gente nasce em uma data e conforme passam-se as datas dos aniversários, mais velho ficamos, até que uma certa data tudo se acaba. Tente conseguir a data de nascimento de uma mulher, esqueca da data do aniversário de casamento…

Lembro de quando precisei somar datas no PHP, pela primeira vês, e quando precisei fazer aritmética com datas no MySQL, e sem esquecer das datas no Flex.

Mais alguns dos problemas de datas no Flex eu vou exemplificar um pouco agora . . .

Fuso Horário do Windows

O Flex trabalha com datas no formato UTC. Mais o que é UTC?

Horário UTC é Horário universal coordenado (em inglês Coordinated Universal Time). É o fuso horário de referência a partir do qual se calculam todas as outras zonas horárias do mundo ou fuso horário de referência de “zero hora”.

A nova denominação foi cunhada para eliminar a inclusão de uma localização específica num padrão internacional, assim como para basear a medida do tempo nos padrões atômicos, mais do que nos celestes. A vantagem da utilização do UTC é que não depende das políticas dos diversos países ou comunidades, e não necessita de regulação relativa a horas de inverno ou verão. (Fonte pt.wikipedia).

Abaixo estão os principais problemas no trabalho com datas:

  • Data Atual (Esta data depende da data configurado no computador do usuário);
  • Somar dias;
  • Somar Meses;
  • Somar anos;
  • Somar datas;
  • Fuso Horário.

Criando Datas

Você poderá chamar a classe data de várias formas, para, dependendo da necessidade. A primeira é apenas instanciando a classe Date() para obter a data atual.

Arquivo main01.mxml
var DataAtual:Date = new Date();

Se você passar apenas elemento numérico, ele retorna uma data e contando da data de 1º de Janeiro de 1970. Eu chamei a Date(0), e recebi a seguinte data: “31/12/1969 21:00:00″.

Mais não seria Janeiro de 1970?

Para aqueles que, como eu, o Fuso Horário esta definido como -03:00, esta sendo descontado este tempo da data de 1º de Janeiro de 1970. Então 21H somando mais 03H chegamos há 24H.

Arquivo main01.mxml
var DataJaneiro1970:Date = new Date(0);

Também é possível passar uma sequência de valores numéricos para a classe. Esses parâmetros são respectivamente ano, mês, dia, hora, minuto, segundo e milissegundo. O unico detalhe a lembrar é que os meses iniciam em 0 (zero), sendo Janeiro=0, Fevereiro=1, etc.

Arquivo main01.mxml
var DataEscritaPost:Date = new Date(2008, 10, 12, 14, 33, 21, 967);

Abaixo segue um exemplo onde há criação de datas.

Aritmética com datas

Esta com certeza é a pior tarefa que envolve datas, já vi exemplos como este abaixo para somar um mês da data atual:

var DataAtual:Date = new Date();
var DataEscritaPost:Date = new Date(DataAtual.getFullYear(),
                                    DataAtual.getMonth() + 1,
                                    DataAtual.getDate());

Funciona, mais há processos mais fáceis. Não há um método pronto que faça isso, mais abaixo mostro com detalhes estas somas.

Arquivo main02.mxml
private static const DataAtual:Date = new Date();
private function somarDias(data:Date, dias:int):Date
{
    var dataTMP:Date = new Date(data);
    dataTMP.setDate(dataTMP.getDate() + dias);
    return dataTMP;
}
private function somarMeses(data:Date, Meses:int):Date
{
    var dataTMP:Date = new Date(data);
    dataTMP.setMonth(dataTMP.getMonth() + Meses);
    return dataTMP;
}
private function somarAnos(data:Date, Anos:Number):Date
{
    var dataTMP:Date = new Date(data);
    dataTMP.setFullYear(dataTMP.getFullYear() + Anos);
    return dataTMP;
}
private function init():void
{
    amanha.text    = "Amanhã é dia: "   + DateFormatter.format(somarDias(DataAtual, 1));
    mesQueVem.text = "Daqui a um Mês é dia: " + DateFormatter.format(somarMeses(DataAtual, 1));
    anoQueVem.text = "Daqui a um Ano é dia: " + DateFormatter.format(somarAnos(DataAtual, 1));
}

Fuso Horário

Se você pegar um sistema de uma empresa multi-nacional, encontrará um problema com relação ao Fuso-Horário.

O método getTimezoneOffset() é úteis quando você deseja converter datas de um fuso horário para outro. Ele retorna o valor como a diferença de minutos entre o fuso horário do objeto Date e o UTC.

Arquivo main03.mxml
private static const DataAtual:Date = new Date();

Atual.text = "Data Atual: " + DateFormatter.format(DataAtual);

private var offsetMilliseconds:Number = DataAtual.getTimezoneOffset() * 60 * 1000;
DataAtual.setTime(DataAtual.getTime() + offsetMilliseconds);

UTC.text = "Data UTC: " + DateFormatter.format(DataAtual);

Abaixo segue um exemplo, onde é apresentado a data atual e a data no UTC.

PS: Sempre utilize “data atual” vinda do servidor, nunca confie na data que o usuário possui na maquina local.

O código fonte deste Post esta disponível aqui.

Fique por dentro de nossas novidades, ideias e atualizações