Salve, salve amigos,
Em algum momento do dia-a-dia desenvolvendo aplicações, surge a necessidade de manipularmos datas e horários. Diante deste cenário, surgem determinadas dúvidas que requerem conhecimentos matemáticos. Para não nos deixar de cabelo em pé com estes cálculos, a VCL tem um vasto conjunto de classes e métodos que ajuda nestes cálculos. Neste artigo, vamos verificar que funções são essas e exemplificar através de situações reais a aplicabilidade das mesmas.
DateUtils a unit mágica |
As classes e métodos que irão nos ajudar neste artigo fazem parte da unit DateUtils e foram testadas no Delphi 2000 e 2010. A maior parte está disponível na versão 7 do Delphi também.
É importante saber que poderemos representar datas e horários através do tipo TDateTime, que mapeia um tipo double, onde a parte inteira corresponde a Data e a parte decimal corresponde a Hora. O tipo TDate ou TTime podem ser utilizados e estes mapeiam o TDateTime.
Se uma variável do tipo TDateTime recebe 0, a data equivalente será 30/12/1899 e a hora 00:00:00. Caso a data seja 29/12/1899 e o horário 06:00, o valor no formato double será -1.25, mas não será necessário trabalhar com números, pois a unit DateUtils irá ajudar muito.
É importante saber que poderemos representar datas e horários através do tipo TDateTime, que mapeia um tipo double, onde a parte inteira corresponde a Data e a parte decimal corresponde a Hora. O tipo TDate ou TTime podem ser utilizados e estes mapeiam o TDateTime.
Se uma variável do tipo TDateTime recebe 0, a data equivalente será 30/12/1899 e a hora 00:00:00. Caso a data seja 29/12/1899 e o horário 06:00, o valor no formato double será -1.25, mas não será necessário trabalhar com números, pois a unit DateUtils irá ajudar muito.
Métodos para criação de datas |
Ao criar ou ler variáveis do tipo TDateTime, muitos desenvolvedores se preocupam com o formato: DD/MM/AAAA, AAAA/DD/MM, MM/DD/AAAA.. Outras preocupações, em muitos casos, surgem devido ao formato de data da máquina. Mas esta preocupação não é necessária, pois basta saber utilizar os métodos EncodeDate, EncodeTime, DecodeDate.e DecodeTime.
O método EncodeDate nos ajuda a criar variáveis, passando como parâmetro: dia, mês e ano para o EncodeTime, também serão passados: hora, minuto, segundo e milesegundo.
O método EncodeDate nos ajuda a criar variáveis, passando como parâmetro: dia, mês e ano para o EncodeTime, também serão passados: hora, minuto, segundo e milesegundo.
var
Data : TDateTime;
begin
Data := EncodeDate( 2010, 10, 28 );
ShowMessage( DateToStr(Data) );
Data : TDateTime;
begin
Data := EncodeDate( 2010, 10, 28 );
ShowMessage( DateToStr(Data) );
// Lendo uma variável Data
var
Dia, Mes, Ano : Word;
begin
DecodeDate(Date, Ano, Mes, Dia);
ShowMessage( 'Dia : ' + InttoStr(Dia) + #13 +
'Mês : ' + InttoStr(Mes) + #13 +
'Ano : ' + InttoStr(Ano) );
Neste exemplo será apresentando Dia : 4 // Mês : 4 // Ano : 2006, independente da configuração de data e hora da máquina.
Calculando Dias |
Calcular quantos dias existem entre duas datas, quantos dias na semana, quantos dias no mês, considerar o ano bissexto e outras informações são fundamentais quando você tem que fazer cálculo de juros, dias úteis e outros cálculos. Vejamos alguns métodos que podem nos ajudar.
// Quantos dias existem em cada mês do ano
Const
S : String = '%s: %d dias';
var
Y, M: Integer;
Meses: String;
begin
Y := 2006; //Ano que estará sendo considerado neste exemplo
for M := 1 to 12 do
begin
Meses := Meses + Format(S, [ShortMonthNames[M],MonthDays[IsLeapYear(Y), M]]) +#13;
end;
ShowMessage(Meses);
O exemplo acima irá resultar em quantos dias existem em cada mês do ano de 2006. O resultado será:
jan: 31 dias // fev: 28 dias // mar: 31 dias // abr: 30 dias // mai: 31 dias // jun: 30 dias // jul: 31 dias // ago: 31 dias // set: 30 dias // out: 31 dias // nov: 30 dias // dez: 31 dias //
Perceba que utilizamos o array ShortMonthNames, que retorna o nome de cada mês, abreviado de acordo com o idioma do Windows. Você poderá sobrescrever os nomes dos meses para cada um deles, caso queira que sua aplicação utilize a sua
maneira. Outro array utilizado é o MonthDays, que é bidimensional e irá retornar o número de dias para cada mês considerando o ano bisexto através do método IsLeapYear, que retorna True ou False (1 ou 0).
{Incrementando Dia, Mês, Ano, Semana, Hora, Minuto, Segundo, .....}
var
Y, M: Integer;
Hoje : TDateTime;
AnoQueVem : TDateTime;
begin
Hoje := Date; // considere que hoje é 25/04/2006
AnoQueVem := IncYear(Hoje, 1);
ShowMessage(DateToStr(AnoQueVem));
// resultado será 25/04/2007
O Exemplo acima irá incrementar a data de hoje em 1 ano: diversas são as funções para o incremento de data e hora, são elas:
Nome da Função | Unit |
IncMonth | SysUtils |
IncAMonth | SysUtils |
IncYear | DateUtils |
IncWeek | DateUtils |
IncDay | DateUtils |
IncHour | DateUtils |
IncMinute | DateUtils |
IncSecond | DateUtils |
IncMilliSecond | DateUtils |
As funções acima certamente irão lhe ajudar nas operações com data e hora.
Outro grupo de funções muito útil é o relacionado a intervalos de data e hora. Todas as funções abaixo citadas estão na unit DateUtils e recebem um parâmetro do tipo TDateTime.
Nome da Função | Unit |
YearsBetween | Retorna o número de anos entre um intervalo |
MonthsBetween | Retorna o número de meses entre um intervalo |
WeeksBetween | Retorna o número de semanas entre um intervalo |
DaysBetween | Retorna o número de dias entre um intervalo |
HoursBetween | Retorna a quantidade de horas entre um intervalo |
MinutesBetween | Retorna a quantidade de minutos entre um intervalo |
SecondsBetween | Retorna a quantidade de segundos entre um intervalo |
MilliSecondsBetween | Retorna q quantidade de milesegundos entre um intervalo |
Take care
Nenhum comentário:
Postar um comentário