Neste artigo veremos alguns procedimentos e funções úteis para cálculo de variáveis do tipo Date e Time. Para a utilização destes obrigatoriamente precisamos declarar a biblioteca DateUtils, na seção uses da Unit em questão.
Salve colegas delphianos. Bom passado as festas de início de ano e as férias
também, vamos ao trabalho.
Para iniciar a série de artigos deste ano, vou começar com um artigo mais
básico, onde veremos alguns procedimentos e funções úteis para cálculo de
variáveis do tipo Data e Time. Para a utilização destes obrigatoriamente
precisamos declarar a biblioteca DateUtils, na seção uses da Unit em questão.

function DayOfTheMonth(const Date: TDateTime): Word;
Retorna o número do índice do dia para mês.
Este índice possui valores entre 1 e 31;
Ex:
ShowMessage('O dia do mês é = '+IntToStr(DayOfTheMonth(Date)));
function DayOfTheWeek(const Date: TDateTime): Integer;
Esta função retorna o número do índice do dia
para a semana. O índice possui valores entre 1 e 7, de acordo com a ordem
abaixo:
Ex.:
var
VetDias: array[1..7] of String;
begin
VetDias[1] := 'Segunda-Feira';
VetDias[2] := 'Terça-Feira';
VetDias[3] := 'Quarta-Feira';
VetDias[4] := 'Quinta-Feira';
VetDias[5] := 'Sexta-Feira';
VetDias[6] := 'Sábado';
VetDias[7] := 'Domingo';
ShowMessage('Hoje é '+VetDias[DayOfTheWeek(Date)]);
end;
function DayOfTheYear(const Date: TDateTime): Word;
Esta função retorna o número do índice do dia
para o ano. O índice possui valores entre 1 e 366:
Ex.:
ShowMessage('Hoje '+DateToStr(Date)+' é o ' + IntToStr(DayOfTheYear(Date)) + '
dia do ano.');
function DayOfWeek(Date: TDateTime): Integer;
Esta função retorna o número do índice do dia para
a semana. O índice possui valores entre 1 e 7, ao contrário da função
DayOfTheWeek, esta tem seu índice iniciando por 1 = Domingo e terminando com 7 =
Sábado.
Ex.:
ShowMessage('Hoje é '+LongDayNames[DayOfWeek(date)]);
function DaysBetween(const DataInicio, DataFim: TDateTime): Integer;
Esta função retorna a diferença de dias entre
duas datas passadas como parâmetro. Para o retornar o resultado a função leva em
consideração as horas também, ou seja, a cada 24 horas um dia.
Ex.:
var DataAnterior: TDateTime;
begin
DataAnterior := EncodeDateTime(2007, 01, 29, 0, 0, 0, 0);
ShowMessage('A diferença de dias entre as datas é de '+
IntToStr(DaysBetween(DataAnterior, now))+' dia');
end;
Verifique aqui as seguintes funções também: YearsBetween, MonthsBetween,
HoursBetween, MinutesBetween, SecondsBetween.
Ex.:
var DataAnterior: TDateTime;
begin
DataAnterior := EncodeDateTime(2006, 01, 29, 0, 0, 0, 0);
ShowMessage('A diferença de dias entre as datas é de '+
IntToStr(DaysBetween(DataAnterior, now))+' dia.');
ShowMessage('A diferença de dias entre as datas é de '+
IntToStr(YearsBetween(DataAnterior, now))+' anos.');
ShowMessage('A diferença de dias entre as datas é de '+
IntToStr(MonthsBetween(DataAnterior, now))+' meses.');
ShowMessage('A diferença de dias entre as datas é de '+
IntToStr(HoursBetween(DataAnterior, now))+' horas.');
ShowMessage('A diferença de dias entre as datas é de '+
IntToStr(MinutesBetween(DataAnterior, now))+' minutos.');
ShowMessage('A diferença de dias entre as datas é de '+
IntToStr(SecondsBetween(DataAnterior, now))+' segundos.');
end;
function DaysInAMonth(const Ano, Mes: Word): Word;
Esta função retorna o número de dias em um determinado mês.
Ex.:
ShowMessage('Dias em Janeiro de 2007 = '+IntToStr(DaysInAMonth(2007, 1)));
function DaysInAYear(const Ano: Word): Word;
Nesta função será retornado o número de dias em um determinado ano.
Ex.:
ShowMessage('2007 terá '+IntToStr(DaysInAYear(2007))+' dias.');
function DaySpan(const DataInicio, DataFim: TDateTime): Double;
Esta função retorna em numero fracionários a diferença entre data inicial e
final. Por exemplo, se o resultado for 2 dias e 12 horas, o retorno será de
2.50.
Ex.:
var minhadatainicial, minhadatafinal : TDateTime;
begin
minhadatainicial := EncodeDateTime(2007, 01, 29, 0, 0, 0, 0);
minhadatafinal := EncodeDateTime(2007, 01, 31, 06, 0, 0, 0);
ShowMessage('Diferença fracionada entre datas = '+FloatToStrF(DaySpan(minhadatainicial,
minhadatafinal),fffixed,8,2)+' dias.');
end;
function FileAge(const FileName: string): Integer;
Nesta função será retornada a última data de modificação de um arquivo no
formato inteiro. Para chamar esta função, não é necessária abertura e fechamento
do arquivo. Se o arquivo não for encontrado no local especificado será retornado
-1.
Ex.:
var dataArquivo: Integer;
begin
dataArquivo := FileAge('c:\meuarquivo.txt');
if dataArquivo > -1 then
ShowMessage('c:\meuarquivo.txt foi modificado pela última vez em: '+ DateToStr(FileDateToDateTime(dataArquivo)))
else
ShowMessage('Arquivo não encontrado.');
end;
function FileSetDate(const FileName: string; FileAge: Integer): Integer;
Esta função seta uma nova data de modificação para o arquivo.
Ex.:
var dataArquivo: Integer;
begin
dataArquivo := FileAge('c:\meuarquivo.txt');
if dataArquivo > -1 then begin
FileSetDate('c:\meuarquivo.txt',DateTimeToFileDate(Date));
dataArquivo := FileAge('c:\meuarquivo.txt');
ShowMessage('c:\meuarquivo.txt foi modificado pela última vez em: '+ DateToStr(FileDateToDateTime(dataArquivo)))
end else
ShowMessage('Arquivo não encontrado.');
end;
Esta função também pode ser utilizado desta forma, function FileSetDate(FileHandle:
Integer; FileAge: Integer): Integer; para tal teremos que utilizar a função
FileOpen.
function IncDay(const AValue: TDateTime; const ANumberOfDays: Integer = 1):
TDateTime;
Esta função retorna a data passada como parâmetro, acrescida/decrescida dos dias
passados, também como parâmetro.
Ex.:
begin
ShowMessage('Data + 10 Dias: '+DateToStr(IncDay(date,10)));
ShowMessage('Data - 15 Dias: '+DateToStr(IncDay(date,-15)));
end;
function IncMilliSecond(const AValue: TDateTime; const ANumberOfMilliSeconds:
Int64 = 1): TDateTime;
Esta função retorna o tempo passado como parâmetro acrescido/decrescido dos
“milisegundos” passados, também como parâmetro.
Ex.:
var minhaData : TDateTime;
begin
minhaData := now;
ShowMessage('Minha Data: '+DateTimeToStr(minhaData));
minhaData := IncMillisecond(minhaData, 7000);
ShowMessage('Minha Data + 7000 milliseconds = '+DateTimeToStr(minhaData));
minhaData := IncMillisecond(minhaData, -3000);
ShowMessage('Minha Data - 3000 milliseconds = '+DateTimeToStr(minhaData));
end;
function IncMinute(const AValue: TDateTime; const ANumberOfMinutes: Int64 = 1):
TDateTime;
Esta função retorna o tempo passado como parâmetro, acrescido/decrescido dos
minutos passados, também como parâmetro a função.
Ex.:
var minhaData : TDateTime;
begin
minhaData := now;
ShowMessage('Minha Data: '+DateTimeToStr(minhaData));
minhaData := IncMinute(minhaData, 15);
ShowMessage('Minha Data + 15 minutos = '+DateTimeToStr(minhaData));
minhaData := IncMinute(minhaData, -10);
ShowMessage('Minha Data - 10 minutos = '+DateTimeToStr(minhaData));
end;
function IncMonth(const Date: TDateTime; NumberOfMonths: Integer = 1): TDateTime;
Esta função retorna o tempo passado como parâmetro, acrescido/decrescido do
número de meses passados, também como parâmetro a função.
Ex.:
var minhaData : TDateTime;
begin
minhaData := now;
ShowMessage('Minha Data: '+DateTimeToStr(minhaData));
minhaData := IncMonth(minhaData, 2);
ShowMessage('Minha Data + 2 meses = '+DateTimeToStr(minhaData));
minhaData := IncMonth(minhaData, -1);
ShowMessage('Minha Data - 1 mês = '+DateTimeToStr(minhaData));
end;
function IncSecond(const AValue: TDateTime; const ANumberOfSeconds: Int64 = 1):
TDateTime;
Esta função retorna o tempo passado como parâmetro, acrescido/decrescido da
quantidade de segundos também passados como parâmetro a função.
Ex.:
var minhaData : TDateTime;
begin
minhaData := now;
ShowMessage('Minha Data: '+DateTimeToStr(minhaData));
minhaData := IncSecond(minhaData, 30);
ShowMessage('Minha Data + 30 seg. = '+DateTimeToStr(minhaData));
minhaData := IncSecond(minhaData, -20);
ShowMessage('Minha Data - 20 seg. = '+DateTimeToStr(minhaData));
end;
function IncYear(const AValue: TDateTime; const ANumberOfYears: Integer = 1):
TDateTime;
Esta função retorna o tempo passado como parâmetro, acrescido/decrescido do
número de anos também passados como parâmetro a função.
Ex.:
var minhaData : TDateTime;
begin
minhaData := now;
ShowMessage('Minha Data: '+DateTimeToStr(minhaData));
minhaData := IncYear(minhaData, 2);
ShowMessage('Minha Data + 2 anos = '+DateTimeToStr(minhaData));
minhaData := IncYear(minhaData, -1);
ShowMessage('Minha Data - 1 ano = '+DateTimeToStr(minhaData));
end;
function IsLeapYear(Year: Word): Boolean;
Função que retorna se o ano passado como parâmetro é ou não bissexto.
Ex.:
if IsLeapYear(2007) then
ShowMessage('2007 é ano bissexto')
else
ShowMessage('2007 não é ano bissexto');
SecsPerDay / MinsPerDay / HoursPerDay
Funções que retornam respectivamente a quantidade de segundos em um dia, minutos
em um dia e horas em um dia.
Ex.:
ShowMessage('O dia tem '+IntToStr(HoursPerDay)+' horas.');
ShowMessage('O dia tem '+IntToStr(MinsPerDay)+' minutos.');
ShowMessage('O dia tem '+IntToStr(SecsPerDay)+' segundos.');
function MonthOfTheYear(const Date: TDateTime): Word;
Esta função retorna o índice do mês da data passada como parâmetro. Este retorno
está entre 1 = Janeiro e 12 = Dezembro.
Ex.:
ShowMessage('O mês da data atual é '+LongMonthNames[ (MonthOfTheYear(date)) ]);
Outras funções interessantes:
var
minhadatainicial, minhadatafinal : TDateTime;
begin
ShowMessage('Horas decorridas até hoje no ano = ' + IntToStr(HourOfTheYear(date)));
ShowMessage('Horas decorridas até hoje no mês = ' + IntToStr(HourOfTheMonth(date)));
minhadatainicial := EncodeDateTime(2007, 01, 29, 0, 0, 0, 0);
minhadatafinal := EncodeDateTime(2007, 01, 31, 06, 0, 0, 0);
ShowMessage('Diferença fracionada entre datas = '+FloatToStrF(HourSpan(minhadatainicial,
minhadatafinal), fffixed, 8, 2) + ' horas.');
ShowMessage('Diferença fracionada entre datas = '+FloatToStrF(MinuteSpan(minhadatainicial,
minhadatafinal), fffixed, 8, 2)+' minutos.');
ShowMessage('Diferença fracionada entre datas = '+FloatToStrF(SecondSpan(minhadatainicial,
minhadatafinal), fffixed, 8, 2)+' segundos.');
ShowMessage('Ontem era '+LongDayNames[DayOfWeek(YesterDay)]);
ShowMessage('Amanha será '+LongDayNames[DayOfWeek(Tomorrow)]);
case CompareDateTime(minhadatainicial,minhadatafinal) of
-1: ShowMessage('Data inicio menor que data fim.');
0 : ShowMessage('Datas iguais.');
1 : ShowMessage('Data inicio maior que data fim.');
end;
ShowMessage('Hoje é a '+ IntToStr(NthDayOfWeek(Date)) + 'ª ' + LongDayNames[DayOfWeek(Today)]+'
do mês.');
end;
Estas são apenas algumas funções de cálculo com datas, em alguns momentos foram
abordadas funções e/ou procedimentos para conversão de datas, mas este não é o
objetivo do artigo. Outras funções não muito utilizadas para cálculo com datas
também não foram abordadas, visto o tamanho do artigo.
Espero que o conteúdo acima veja a ajudar e tirar algumas dúvidas,
principalmente do pessoal iniciante.
Clique aqui para fazer o download dos fontes.
Até a próxima.
Gustavo Frassini -
gustavo@activedelphi.com.br
|