Lidar com datas é uma necessidade presente na maioria dos sistemas, principalmente os comerciais em que existem diversos cadastros e relatórios que utilizam datas como filtros.

Neste post, veremos como trabalhar com duas das principais funções do Delphi para manipular datas: EncodeDate e DecodeDate.

DecodeDate é um procedure contido na unit SysUtils que recebe uma data, que se deseja separar, e mais três parâmetros por referência que receberão o valor do dia, mês e ano da data informada. Sua assinatura é a seguinte:

procedure DecodeDate(const Date: TDateTime; var Year:Word; var Month:Word; var Day:Word);

Note que os argumentos Year, Month e Day são recebidos por referência (por isso aparecem precedidos da palavra reservada var), pois serão alteradas dentro do procedure.

EncodeDate também está contida na unit SysUtils e é uma function que atua de forma inversa à DecodeDate, recebendo três argumentos que representam o ano, o mês e o dia e retorna uma data composta por essas partes. Sua assinatura é a seguinte:

function EncodeDate(Year:Word; Month:Word; Day:Word):TDateTime;

Para compreender melhor o funcionamento dessas funções, vamos criar uma aplicação VCL Forms no Delphi. Primeiramente, adicione um botão e três labels, que devem ser nomeados como lblDia, lblMes e lblAno. No evento OnClick do botão, codifique conforme a Listagem 1.

Listagem 1: Exemplo de uso do DecodeDate

procedure TForm2.Button1Click(Sender: TObject);
var
  dia, mes, ano : Word;
begin
  DecodeDate(Date, ano, mes, dia);
  lblDia.Caption := 'Dia: ' + IntToStr(dia);
  lblMes.Caption := 'Mês: ' + IntToStr(mes);
  lblAno.Caption := 'Ano: ' + IntToStr(ano);
end;

Ao executar a aplicação e clicar no botão, teremos nos labels, separadamente, o dia, o mês e o ano da data atual (a função Date retorna um TDateTime com a data atual), semelhante à Figura 1.

Exemplo de uso do DecodeDate

Figura 1: Exemplo de uso do DecodeDate

Para testar o EncodeDate, precisaremos de apenas um label, que chamaremos de lblData e no OnClick do botão codificaremos de acordo com a Listagem 2. Note que podemos montar uma data a partir de valores separados, desde que esses parâmetros formem uma data válida.

Listagem 2: Exemplo de uso do EncodeDate

procedure TForm2.Button1Click(Sender: TObject);
var
  dia, mes, ano : Word;
  data : TDateTime;
begin
  ano := 2015;
  mes := 2;
  dia := 15;
  data := EncodeDate(ano, mes, dia);
  lblData.Caption := 'Data: ' + DateToStr(data);
end;

O resultado é mostrado na Figura 2.

Exemplo de uso do EncodeDate

Figura 2: Exemplo de uso do EncodeDate

As possibilidades de uso destas funções são as mais diversas possíveis. Por exemplo, imagine que precisamos montar um relatório cujo período de filtro deve ser sempre do primeiro dia do mês corrente até o dia atual. Poderíamos usar a função DecodeDate para pegar o ano e mês atuais, e depois usar o EncodeDate para criar a primeira data com esses valores e o dia 1. Na Listagem 3 temos o código deste exemplo, seguido do resultado na Figura 3.

Listagem 3: Exemplo prático de uso

procedure TForm2.Button1Click(Sender: TObject);
var
  dia, mes, ano : Word;
  dataInicial : TDateTime;
begin
  DecodeDate(Date, ano, mes, dia);
  dataInicial := EncodeDate(ano, mes, 1);
  lblDataInicial.Caption := 'Início: ' + DateToStr(dataInicial);
  lblDataFinal.Caption   := 'Fim: ' + DateToStr(Date);
end;
Exemplo prático de uso

Figura 3: Exemplo prático de uso

Certamente você já precisou trabalhar com datas em suas aplicações. Agora, poderá explorar essas funções e utilizá-las em diversas situações.