Abra o Delphi (neste artigo fora utilizado o Delphi 2007) e adicione uma nova unit e salve-a como untTEAMDateTime:
Adicione os tipos a seguir:
unit untTEAMDateTime; interface uses untTEAMString, untTEAMNumeric, DateUtils, SysUtils, Controls; type {$REGION 'TCSTDate '} TCSTDate = record public Value: TDateTime; end; {$ENDREGION} {$REGION 'TCSTTime'} TEAMTime = record public Value: TDateTime; end; {$ENDREGION} implementation end.
O campo "Value" nos dois records ira armazenar o conteúdo do nosso dado para que possamos aplicar as operações.
Como fizemos na unit untTEAMNumeric, vamos aproveitar aqui também os tipos TEAMString da untTEAMString e o TEAMInteger da untTEAMNumeric em alguns métodos. Vamos a listagem:
$REGION ' TEAMDate'} TEAMDate = record public Value: TDateTime; function ToString: TEAMString; function ToSqlServerFormat: TEAMString; function Date: TDate; function Formatar(Formato: string): TEAMString; function ToExtenco: TEAMString; function MesToExtenco: TEAMString; function DiaDaSemanaExtenco: TEAMString; function GetDia: TEAMinteger; function GetMes: TEAMinteger; function GetAno: TEAMinteger; function GetDiaSemana: TEAMinteger; function GetPrimeiroDiaMes: TEAMinteger; function GetUltimoDiaMes: TEAMinteger; procedure ADDMes(Meses: Integer); function DiasNoMes: TEAMinteger; function isAnoBiSexto: Boolean; function isFimDeSemana: Boolean; function INDates(DataInicial, DataFinal: Tdate): Boolean; procedure AddDias(NumDias: Integer); procedure SubDias(NumDias: Integer); procedure Encode(Dia, mes, ano: Word); procedure EncodeFromString(Data: string); procedure ReplaceTimer; procedure SetDateNow; end; {$ENDREGION} {$REGION ' TEAMTime'} TEAMTime = record public Value: TDateTime; function ToString: TEAMString; function DataHoraString: TEAMString; function Formatar(Formato: string): TEAMString; function GetHora: TEAMString; function GetMinutos: TEAMString; function GetSegundos: TEAMString; function ToExtenco: TEAMString; function ToMinutos: Integer; end; {$ENDREGION}
A maioria dos métodos para Data/Hora estão presentes. Alguns muitos úteis como retornar o último dia do mês, adicionar dias a data, verificar se a data é final de semana, etc. Sinta-se a vontade para adicionar outros que achar nescessário. O próximo passo é a implementação dos métodos.
Veja a listagem completa da nossa unit:
unit untTEAMDateTime; interface uses untTEAMString, untTEAMNumeric, DateUtils, SysUtils, Controls; type {$REGION ' TEAMDate'} TEAMDate = record public Value: TDateTime; function ToString: TEAMString; function ToSqlServerFormat: TEAMString; function Date: TDate; function Formatar(Formato: string): TEAMString; function ToExtenco: TEAMString; function MesToExtenco: TEAMString; function DiaDaSemanaExtenco: TEAMString; function GetDia: TEAMinteger; function GetMes: TEAMinteger; function GetAno: TEAMinteger; function GetDiaSemana: TEAMinteger; function GetPrimeiroDiaMes: TEAMinteger; function GetUltimoDiaMes: TEAMinteger; procedure ADDMes(Meses: Integer); function DiasNoMes: TEAMinteger; function isAnoBiSexto: Boolean; function isFimDeSemana: Boolean; function INDates(DataInicial, DataFinal: Tdate): Boolean; procedure AddDias(NumDias: Integer); procedure SubDias(NumDias: Integer); procedure Encode(Dia, mes, ano: Word); procedure EncodeFromString(Data: string); procedure ReplaceTimer; procedure SetDateNow; end; {$ENDREGION} {$REGION ' TEAMTime'} TEAMTime = record public Value: TDateTime; function ToString: TEAMString; function DataHoraString: TEAMString; function Formatar(Formato: string): TEAMString; function GetHora: TEAMString; function GetMinutos: TEAMString; function GetSegundos: TEAMString; function ToExtenco: TEAMString; function ToMinutos: Integer; end; {$ENDREGION} implementation {$REGION 'TEAMDate'} { TEAMDate } {------------------------------------------------------------------------------- Procedure: TEAMDate.AddDias Arguments: NumDias: Integer Result: None Objetivo: Adicionar dias para a data -------------------------------------------------------------------------------} procedure TEAMDate.AddDias(NumDias: Integer); begin Self.Value := IncDay(Self.Value, NumDias); end; {------------------------------------------------------------------------------- Procedure: TEAMDate.INDates Arguments: DataInicial, DataFinal: Tdate Result: Boolean Objetivo: Testar se uma data está em um intervalo -------------------------------------------------------------------------------} function TEAMDate.INDates(DataInicial, DataFinal: Tdate): Boolean; begin Result := ((CompareDate(Self.Value, DataInicial) >= 0) and (CompareDate(Self.Value, DataFinal) <= 0)); end; {------------------------------------------------------------------------------- Procedure: TEAMDate.DiaDaSemanaExtenco Arguments: None Result: TEAMString Objetivo: Retornar o dia em extenço -------------------------------------------------------------------------------} function TEAMDate.DiaDaSemanaExtenco: TEAMString; const semana: array[1..7] of string = ('Domingo', 'Segunda-feira', 'Terça-feira', 'Quarta-feira', 'Quinta-feira', 'Sexta-feira', 'Sábado'); begin Result.Text := semana[DayOfWeek(Self.Value)] end; function TEAMDate.Date: TDate; begin result := Self.Value; end; {------------------------------------------------------------------------------- Procedure: TEAMDate.DiasNoMes Arguments: None Result: Integer Objetivo: Retornar o numero de dias no mes -------------------------------------------------------------------------------} function TEAMDate.DiasNoMes: TEAMinteger; const DaysInMonth: array[1..12] of Integer = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); begin Result.Value := DaysInMonth[Self.GetMes.Value]; if (Self.GetMes.Value = 2) and Self.isAnoBiSexto then Inc(Result.Value); end; {------------------------------------------------------------------------------- Procedure: TEAMDate.Encode Arguments: Ano mes e dia Result: nenhum Objetivo: Transforma o dia,mes e ano em uma data -------------------------------------------------------------------------------} procedure TEAMDate.Encode(Dia, mes, ano: Word); begin Self.Value := EncodeDate(ano, mes, dia); end; {------------------------------------------------------------------------------- Procedure: TEAMDate.EncodeFromString Arguments: Data: string Result: None Objetivo: Conveter uma string para uma data -------------------------------------------------------------------------------} procedure TEAMDate.EncodeFromString(Data: string); begin Self.Value := StrToDate(data); end; {------------------------------------------------------------------------------- Procedure: TEAMDate.Formatar Arguments: Formato: string Result: TEAMString Objetivo: Retornar a data formatada de acordo com o parametro passado -------------------------------------------------------------------------------} function TEAMDate.Formatar(Formato: string): TEAMString; begin Result.Text := FormatDateTime(Formato, Self.Value); end; {------------------------------------------------------------------------------- Procedure: TEAMDate.GetAno Arguments: None Result: Integer Objetivo: Retornar o ano -------------------------------------------------------------------------------} function TEAMDate.GetAno: TEAMinteger; var ano, mes, dia: Word; begin DecodeDate(Self.Value, ano, mes, dia); Result.Value := ano; end; {------------------------------------------------------------------------------- Procedure: TEAMDate.GetDia Arguments: None Result: Integer Objetivo: Retornar o dia -------------------------------------------------------------------------------} function TEAMDate.GetDia: TEAMinteger; var ano, mes, dia: Word; begin DecodeDate(Self.Value, ano, mes, dia); Result.Value := dia; end; {------------------------------------------------------------------------------- Procedure: TEAMDate.GetDiaSemana Arguments: None Result: Integer Objetivo: Retornar o dia da semana -------------------------------------------------------------------------------} function TEAMDate.GetDiaSemana: TEAMinteger; begin Result.Value := DayOfTheWeek(Self.Value) end; {------------------------------------------------------------------------------- Procedure: TEAMDate.GetMes Arguments: None Result: Integer Objetivo: Retornar o mes da data -------------------------------------------------------------------------------} function TEAMDate.GetMes: TEAMinteger; var ano, mes, dia: Word; begin DecodeDate(Self.Value, ano, mes, dia); Result.Value := mes; end; {------------------------------------------------------------------------------- Procedure: TEAMDate.GetPrimeiroDiaMes Arguments: Nenhum Result: Nenhum Objetivo: Retornar o primeiro dia do mes -------------------------------------------------------------------------------} function TEAMDate.GetPrimeiroDiaMes: TEAMinteger; begin Result.Value := 1; end; {------------------------------------------------------------------------------- Procedure: TEAMDate.GetUltimoDiaMes Arguments: Nenhum Result: Nenhum Objetivo: Retornar o ultimo dia do mes -------------------------------------------------------------------------------} function TEAMDate.GetUltimoDiaMes: TEAMinteger; var ano, mes, dia: word; temp: TDate; begin DecodeDate(Self.Value, ano, mes, dia); mes := mes + 1; if mes = 13 then begin mes := 1; ano := ano + 1; end; temp := EncodeDate(ano, mes, 1) - 1; Result.Value := DayOf(temp); end; {------------------------------------------------------------------------------- Procedure: TEAMDate.ADDMes Arguments: Meses: Integer Result: None Objetivo: Adicionar um numero de meses a data -------------------------------------------------------------------------------} procedure TEAMDate.ADDMes(Meses: Integer); begin Self.Value := IncMonth(Self.Value, Meses); end; {------------------------------------------------------------------------------- Procedure: TEAMDate.isAnoBiSexto Arguments: None Result: Boolean Objetivo: Retornar se o ano é bissexto -------------------------------------------------------------------------------} function TEAMDate.isAnoBiSexto: Boolean; begin Result := (Self.GetAno.Value mod 4 = 0) and ((Self.GetAno.Value mod 100 <> 0) or (Self.GetAno.Value mod 400 = 0)); end; {------------------------------------------------------------------------------- Procedure: TEAMDate.isFimDeSemana Arguments: None Result: Boolean Objetivo: Retorna se a data é um fim de semana -------------------------------------------------------------------------------} function TEAMDate.isFimDeSemana: Boolean; {Verifica se uma data informada cai em um final de semana} begin if DayOfWeek(Self.Value) in [1, 7] then result := true else result := false; end; {------------------------------------------------------------------------------- Procedure: TEAMDate.MesToExtenco Arguments: None Result: TEAMString Objetivo: Retornar o mês por extenco -------------------------------------------------------------------------------} function TEAMDate.MesToExtenco: TEAMString; begin case Self.GetMes.Value of 1: Result.Text := 'Janeiro'; 2: Result.Text := 'Fevereiro'; 3: Result.Text := 'Março'; 4: Result.Text := 'Abril'; 5: Result.Text := 'Maio'; 6: Result.Text := 'Junho'; 7: Result.Text := 'Julho'; 8: Result.Text := 'Agosto'; 9: Result.Text := 'Setembro'; 10: Result.Text := 'Outubro'; 11: Result.Text := 'Novembro'; 12: Result.Text := 'Dezembro'; else Result.Text := ''; end; end; {------------------------------------------------------------------------------- Procedure: TEAMDate.ReplaceTimer Arguments: None Result: None Objetivo: Apaga a hora -------------------------------------------------------------------------------} procedure TEAMDate.ReplaceTimer; var newTime: TDateTime; begin newTime := EncodeTime(0, 0, 0, 0); ReplaceTime(self.Value, newTime); end; {------------------------------------------------------------------------------- Procedure: TEAMDate.SetDateNow Arguments: None Result: None Objetivo: seta a dataHora para o horario atual -------------------------------------------------------------------------------} procedure TEAMDate.SetDateNow; begin Self.Value := Now; end; {------------------------------------------------------------------------------- Procedure: TEAMDate.SubDias Arguments: NumDias: Integer Result: None Objetivo: Subtrair um numero de dias da data -------------------------------------------------------------------------------} procedure TEAMDate.SubDias(NumDias: Integer); begin NumDias := (NumDias * -1); Self.AddDias(NumDias); end; {------------------------------------------------------------------------------- Procedure: TEAMDate.ToExtenco Arguments: None Result: TEAMString Objetivo: Retornar a data por extenço -------------------------------------------------------------------------------} function TEAMDate.ToExtenco: TEAMString; begin Result.Text := FormatDateTime('dddddd', Self.Value); end; {------------------------------------------------------------------------------- Procedure: TEAMDate.ToString Arguments: None Result: TEAMString Objetivo: Retornar a data em string -------------------------------------------------------------------------------} function TEAMDate.ToString: TEAMString; begin Result.Text := DateToStr(Self.Value); end; {------------------------------------------------------------------------------- Procedure: TEAMDate.ToSqlServerFormat Arguments: None Result: TEAMString Objetivo: Converter para o formato de data do sqlServer -------------------------------------------------------------------------------} function TEAMDate.ToSqlServerFormat: TEAMString; begin Result.Text := FormatDateTime('YYYY-MM-DD', Self.Value); end; {$ENDREGION} {$REGION 'TEAMTime'} { TEAMTime } {------------------------------------------------------------------------------- Procedure: TEAMTime.DataHoraString Arguments: None Result: TEAMString Objetivo: Retorna a data e a hora em uma string -------------------------------------------------------------------------------} function TEAMTime.DataHoraString: TEAMString; begin Result.Text := DateTimeToStr(Self.Value); end; {------------------------------------------------------------------------------- Procedure: TEAMTime.Formatar Arguments: Formato: string Result: TEAMString Objetivo: Formata a hora de acordo com o formato passado -------------------------------------------------------------------------------} function TEAMTime.Formatar(Formato: string): TEAMString; begin Result.Text := FormatDateTime(Formato, Self.Value); end; {------------------------------------------------------------------------------- Procedure: TEAMTime.GetHora Arguments: None Result: TEAMString Objetivo: Retorna a hora -------------------------------------------------------------------------------} function TEAMTime.GetHora: TEAMString; var hora, minutos, segundos, mcsegundos: Word; begin Decodetime(Self.Value, hora, minutos, segundos, mcsegundos); Result.Text := intToStr(hora); end; {------------------------------------------------------------------------------- Procedure: TEAMTime.GetMinutos Arguments: None Result: TEAMString Objetivo: Retorna os minutos -------------------------------------------------------------------------------} function TEAMTime.GetMinutos: TEAMString; var hora, minutos, segundos, mcsegundos: Word; begin Decodetime(Self.Value, hora, minutos, segundos, mcsegundos); Result.Text := intToStr(minutos); end; {------------------------------------------------------------------------------- Procedure: TEAMTime.GetSegundos Arguments: None Result: TEAMString Objetivo: Retorna os segundos -------------------------------------------------------------------------------} function TEAMTime.GetSegundos: TEAMString; var hora, minutos, segundos, mcsegundos: Word; begin Decodetime(Self.Value, hora, minutos, segundos, mcsegundos); Result.Text := intToStr(segundos); end; {------------------------------------------------------------------------------- Procedure: TEAMTime.ToString Arguments: None Result: TEAMString Objetivo: Converte para string -------------------------------------------------------------------------------} function TEAMTime.ToString: TEAMString; begin Result.Text := TimeToStr(Self.Value); end; {------------------------------------------------------------------------------- Procedure: TEAMTime.ToExtenco Arguments: None Result: TEAMString Objetivo: Retorna a hora em extenço -------------------------------------------------------------------------------} function TEAMTime.ToExtenco: TEAMString; var Hora, Minuto, Segundo: TEAMinteger; begin Hora.Value := self.GetHora.ToInt; Minuto.Value := self.GetMinutos.Toint; Segundo.Value := self.GetSegundos.Toint; Result.Text := Hora.ToExtenco.Text + ' hora'; if Hora.Value > 1 then Result.Text := Result.Text + 's'; if Minuto.Value > 0 then begin Result.Text := Result.Text + ', ' + Minuto.ToExtenco.Text + ' minuto'; if Minuto.Value > 1 then Result.Text := Result.Text + 's' end; if Segundo.Value > 0 then begin Result.Text := Result.Text + ' e ' + Segundo.ToExtenco.Text + ' segundo'; if Segundo.Value > 1 then Result.Text := Result.Text + 's' end; end; {------------------------------------------------------------------------------- Procedure: TEAMTime.ToMinutos Arguments: None Result: Integer Objetivo: Converte Para Minutos -------------------------------------------------------------------------------} function TEAMTime.ToMinutos: Integer; begin Result := (StrToInt(Copy(Self.ToString.Text, 1, 2)) * 60) + StrToInt(Copy(Self.ToString.Text, 4, 2)); end; {$ENDREGION} end.
Agora podemos iniciar o testes. Adione a unit untTEAMDateTime ao formulário:
unit untTEAMDateTime;
Adicione alguns edits e um botão como abaixo:
No ovento onClick do botão escreva o seguinte código:
procedure TForm1.btn1Click(Sender: TObject); var EAMDateTime: TEAMDate; EAMTime: TEAMTime; begin EAMDateTime.SetDateNow; edtValue.Text := EAMDateTime.ToString.Text; edtToExtenco.Text := EAMDateTime.ToExtenco.Text; edtGetDia.Text := EAMDateTime.GetDia.ToString.Text; edtGetMes.Text := EAMDateTime.GetMes.ToString.Text; edtGetAno.Text := EAMDateTime.GetAno.ToString.Text; edtGetUltimoDiaMes.Text := EAMDateTime.GetUltimoDiaMes.ToString.Text; edtHashDateTime.Text := EAMDateTime.ToString.Hash; EAMTime.Value := Now; edtTimeValue.Text := EAMTime.Formatar('HH:MM:SS').Text; edtTimeToExtenco.Text := EAMTime.ToExtenco.Text; edtGetSegundos.Text := EAMTime.GetSegundos.Text; edtGetHora.Text := EAMTime.GetHora.Text; edtGetMinutos.Text := EAMTime.GetMinutos.Text; edtHashTime.Text := EAMTime.ToString.Hash; end
Execute e confira o resultado:
Todos os métodos da listagem foram documentados para facilitar o entendimento da sua finalidade. Fique a vontade para adicionar novos métodos e procedures. :)
Confira aqui o próximo post
Observação: Algumas das procedure e functions usadas neste artigo são uma compilação de códigos encontrados na internet. se você encontrar aqui algum código de sua autoria, entre em contato para que possamos dar-lhe o devido crédito.
0 comentários:
Postar um comentário