Ir para conteúdo
Fórum Script Brasil
  • 0

Anos, Meses E Dias (Resolvido)


Paulo Nobre

Pergunta

Num tópico anterior o programador forneceu o seguinte código para descobrir quantos dias existem entre duas datas.

procedure TForm1.Button1Click(Sender: TObject);

var i : real;

begin

i := StrToDate('31/12/2004') - Date;

ShowMessage('Faltam '+FloatToStr(i)+' para o final do ano. Feliz ano Novo. AUHAUHAUHAUHA!!! ');

end;

A minha pergunta é a seguinte: como faço para descobrir o número de anos, meses e dias desta diferença encontrada (número de dias entre duas datas) no código fornecido acima?

Exemplo: se fosse 428 dias teríamos: 1 ano, 2 meses e 3 dias e não 428/365 anos 428/30 meses.

Uma outra pergunta seria: já estão considerados os anos bissextos e meses de 31 e 28(29 - fevereiro) dias?

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Olá Paulo,

acho que há um erro nesse calculo ae:

Exemplo: se fosse 428 dias teríamos: 1 ano, 2 meses e 3 dias e não 428/365 anos 428/30 meses.

31/12/2004 - 428 = 30/10/2004 => 1 ano 2 meses e 0 dias.

e ai vai um código que faz esse calculo:

Procedure EntreDatas(DataFinal,DataInicial : TDate; var Anos,Meses,Dias : Integer);
//
// Retorna a diferença em Dias,Meses e Anos entre 2 datas
//
  Function Calcula(Periodo : Integer) : Integer;
  var
     intCont : Integer;
  begin
    intCont := 0;
    Repeat
    Inc(intCont);
    DataFinal := IncMonth(DataFinal,Periodo * -1);
    Until DataFinal < DataInicial;
    DataFinal := IncMonth(DataFinal,Periodo);
    Inc(intCont,-1);
    Result := intCont;
  End;
begin
  if DataFinal <= DataInicial then
  begin
    Anos := 0;
    Meses := 0;
    Dias := 0;
    exit;
  end;
  Anos := Calcula(12);
  Meses := Calcula(1);
  Dias := Round(DataFinal - DataInicial);
end;

procedure TForm1.Button1Click(Sender: TObject);
var ano, mes, dia : integer;
begin
  EntreDatas(StrToDate('31/12/2004'),StrToDate('30/10/2003'),ano,mes,dia);
  Edit1.Text := intToStr(ano)+' ano(s), '+intToStr(mes)+' mese(s) e '+intToStr(dia)+' dia(s).';

end;

Abs. Progr'amador.

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado pelo código programador.

Olá Paulo,

acho que há um erro nesse calculo ae:

QUOTE 

Exemplo: se fosse 428 dias teríamos: 1 ano, 2 meses e 3 dias e não 428/365 anos 428/30 meses.

31/12/2004 - 428 = 30/10/2004 => 1 ano 2 meses e 0 dias.

e ai vai um código que faz esse calculo:

O que quis dizer é que dentro de 428 dias temos 1 ano, 2 meses e 3 dias e não em relação ao dia 31/12/2004, pois 428 = 365 + 2x30 + 3.

Link para o comentário
Compartilhar em outros sites

  • 0
O que quis dizer é que dentro de 428 dias temos 1 ano, 2 meses e 3 dias e não em relação ao dia 31/12/2004, pois 428 = 365 + 2x30 + 3.

Certo,

mas, não é possivel definir os dias corretamente se não estipularmos um período, porque os meses variam de 28, 29, 30 e 31 dias, então da forma como você colocou é impossível ter um número correto.

Abs. Progr'amador.

Link para o comentário
Compartilhar em outros sites

  • 0

Exatamente programador, porisso foi que eu escrevi ' E NÃO 428/365 ANOS 428/30 meses. "

Como existe variação de anos bissextos e meses com 30, 29 , 31 e 28 não sabia como fazer.

A sua função resolveu o problema embora não tenha conseguido decifrar ainda todos os detalhes dela.

obrigado

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...