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

Diferença Entre Datas (anos, Meses E Dias)


Paulo Nobre

Pergunta

Prezado Colaboradores

peguei uma Procedure(função) dentro desses programas de dicas , que achei muito interessante para

calcular o número de anos meses e dias entre duas datas.

//A função:

---------------------------------------------------------------

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;

----------------------------------------------------------------

Usei num programa e vinha funcionando normalmente.

Porém, ao chegar no dia 29/3/2005 e calcular a diferença entre está data e por exemplo 30/03/2005( e também 31/3/2005) a função fornece -1 como diferença entre número de dias entre as datas.

Percebi que existe algo falhando quando fazemos diferença entre está data 29 e datas perto delas 30 e 31.

Outro exemplo de erro,seria 29/05/2005 e 31/05/2005, neste caso o programa está apresentando 1 dia de diferença.

Outro exemplo seria 29/10/2005 e 31/05/2005, que apresenta 1 dia como diferença.

Existem outros.

Estou usando no clique de um panel da seguinte forma:

---------------------------------------------------------------

procedure TfrmDiferenca.PanelCalcularClick(Sender: TObject);
Var
  DataFinal: TDate;
  DataInicial: TDate;
  Anos1,Meses1,Dias1: Integer;
begin
Try
  If txtDataInicial.Text = '' Then
    begin
      MessageBox(handle,'É necessário ter a data inicial validada !','FALTA A DATA INICIAL',MB_IconExclamation);
      txtDataInicial.SetFocus;
      abort;
    end;

  If txtDataFinal.Text = '' Then
    begin
      MessageBox(handle,'É necessário ter a data final validada !','FALTA A DATA FINAL',MB_IconExclamation);
      txtDataFinal.SetFocus;
      abort;
    end;

  DataFinal:= StrToDate(txtDataFinal.Text);
  DataInicial:= StrToDate(txtDataInicial.Text);
  EntreDatas( DataFinal,DataInicial,Anos1,Meses1,Dias1);
  txtAnos1.Text := IntToStr(anos1);
  txtMeses1.Text := IntToStr(meses1);
  txtDias1.Text := IntToStr(dias1);
Except
  If txtDataInicial.Text = '' Then
    //Não faz nada.
  Else If txtDataFinal.Text = '' Then
    //Não faz nada.
  Else
   Messagebox(handle,'Um erro inesperado ocorreu.'+#13+ 'Por favor, contate o desenvolvedor do programa informando o erro.','ERRO',MB_IconStop);
end;

end;

---------------------------------------------------------------

Alguém que tenha conhecimanto de funções com datas poderia dizer

se há algum erro com a função?

Será que a minha chamada a ela está errada?

Alguém têm uma outra função que eu poderia usar na minha procedure?

Agradeço desde já a atenção.

A função foi feita, segundo o programa por

Fábio Macedo Garcia

Analista Programador - Delphi

fabio@copaninfo.com.br

Mandei um email para ele mas, não obtive resposta até agora.

Link para o comentário
Compartilhar em outros sites

22 respostass a esta questão

Posts Recomendados

  • 0

Olá Paulo, acredito que o furo esteja em: Meses := Calcula(1);

Quando ele decrementa, está no mes 03 e tira 30 dias; mas quando ele volta a incrementar, está no mes 02 e soma 28 dias; dando aí a diferença de 2 dias.

O problema é da função IncMonth que não é exata e sim por aproximação; e o caro analista não quis gastar muito código escrevendo assim uma rotina errada.

Link para o comentário
Compartilhar em outros sites

  • 0

OLá, s3c,

Obrigado pela sua análise, realmente como não entendi bem a função e acho que será difícil para mim adaptá-la, vou tentar usar a função do delphi

daysBetween(datainicial,datafinal) e fazer aquelas contas do ensino fundamental:

tipo divide por 30 (o resto vai ser o número de dias), pega o quociente divide por 12 (o resto é o número de meses) e o quociente será o número de anos.

Você acha que dará certo assim?

Link para o comentário
Compartilhar em outros sites

  • 0

Acredito que não porque se você pegar DaysBetween de 01/01/2005 até 31/12/2005, resultará em 364 dias e pelas divisões dará 1 ano e 4 dias.

Precisei fazer uma rotina assim p/ checar a idade de indivíduos e a única forma que achei foi destrinchar as duas datas pelo DecodeDate e trabalhar individualmente c/ anos, meses e dias.

Link para o comentário
Compartilhar em outros sites

  • 0

Prezado,s3c,

Usando a sua deixa

Precisei fazer uma rotina assim p/ checar a idade de indivíduos e a única forma que achei foi destrinchar as duas datas pelo DecodeDate e trabalhar individualmente c/ anos, meses e dias.

Estou tentando fazer a rotina.

É trabalhosa e grande como estou achando ou estou escrevendo demais?

Digo isso pois depois de usar decodeDate em DataInicial e Data Final, tenho

que dividir em vários casos(ifs), pois, por exemplo, se Ano Final > Ano Inicial

temos uma situação,caso MesFinal > MesInicial, se Ano Final =Ano Inicial, outra, além de ter que dividir em vários casos se MesFinal for março, maio etc..(por causa dos 31 dias), MesFinal for fevereiro(bissexto ou não), claro também analisando os casos do MesInicial.

É isso tudo mesmo?

Está ficando bem grande. É claro que com a minha não muita experiência, devo estar escrevendo muito(deveria estar fazendo mais subrotinas) e não devo estar usando alguma função adequada dentro da rotina.

Quando você respondeu e não colocou nenhum código imaginei que não fosse uma coisa tão elementar (elementar não no sentido de fácil e sim de não trabalhoso). Aí tentei fazê-la.

Fiquei ontem umas 4 horas em cima dela e ainda está com problemas?

Existe alguma dica a mais que poderia me ajudar a fazer a rotina ou é trabalhosa mesmo?

PS para a comunidade delphi:

Quem está acompanhando este tópico (60 leituras até agora) deve ter observado

como tudo começou: Uma dica tirada destes programas de 850 dicas (no meu caso é o Lyode, acho que é assim que se escreve). Não funciona, na sua totalidade. Por um acaso meu programa é um inofensivo programa para mecher com datas de diversas maneiras. Eu não sou programador.

Imagine quem usa estas dicas para fazer programas para vender?

Você diria: mas tem que testar!

Tudo bem, mas testar como um betatester?

Fiz uma pesquisa longa na Internet e não encontrei uma função(correta) para fazer isto em lugar nenhum. E vejam que isto não é tão incomum assim!

Fazer o que né?

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Paulo, bom a rotina que fiz pode não ser a mais otimizada em termos de código, mas é por aí:

se Ano Final > Ano Inicial

temos uma situação,caso MesFinal > MesInicial, se Ano Final =Ano Inicial, outra

Fiz ± assim também:
if Dti >= Dtf then
  Exit; // datas inválidas 
Anos := Anof - Anoi - 1;
if (Mesi < Mesf)
 or
   ((Mesi = Mesf) and (Diai <= Diaf)) then
  Inc(Anos);

O próximo passo é apurar os meses nas duas situações:

if (Mesi <> Mesf) or ((Mesi = Mesf) and (Diai > Diaf))

além de ter que dividir em vários casos se MesFinal for março, maio etc..(por causa dos 31 dias), MesFinal for fevereiro(bissexto ou não), claro também analisando os casos do MesInicial.
Quando programava em Cobol, tive que fazer assim; tendo uma tabela de

31 00 31 30 31 30 31 31 30 31 30 31 e atualizando o segundo ítem p/ 28 ou 29(vale uma dica p/ quem não souber que um ano é bissexto quando for divisível por 4 e se for divisível por 100 tem que ser divisível por 400); mas no Delphi otimizei um pouco porque você pode montar a data pelo EncodeDate e ir incrementando de 1 em 1 que automaticamente ela muda de mes(quando você adiciona um inteiro a um TDatetime, você está adicionando dias).

É isso tudo mesmo?
Bom, ao menos p/ mim tive que escrever código p/ prever todas as variantes possíveis; não posso garantir que essa rotina esteja exata, mas pelas datas apuradas até agora, ela retornou resultados precisos.

Se você tiver muita dificuldade em desenvolvê-la, me passe seu email que eu te mando; assim conto c/ sua contribuição p/ detectar algum bug p/ poder corrigí-lo.

Link para o comentário
Compartilhar em outros sites

  • 0

aqui tem um componente que uso para saber a idade em anos e funciona beleza..

component....DTCalc.pas
----------------------------------------
{*************************************************************}
{            DateTime Calculator component for Delphi 16/32   }
{ Version:   1.3                                              }
{ Author:    Aleksey Kuznetsov                                }
{ E-Mail:    info@utilmind.com                                }
{ Home Page: http://www.utilmind.com                          }
{ Created:   May, 12, 1999                                    }
{ Modified:  August, 3, 1999                                  }
{ Legal:     Copyright (c) 1999, UtilMind Solutions           }
{*************************************************************}
{  TDTCalc (in English)                                       }
{ Component for calculation of amount of years, months, days, }
{ hours, minutes, seconds and miliseconds past between two    }
{ time intervals.                                             }
{*************************************************************}
{  TDTCalc (in Russian)                                       }
{ Êîìïîíåíòà äëÿ âû÷èñëåíèÿ êîëè÷åñòâà ëåò, ìåñÿöåâ, äíåé,    }
{ ÷àñîâ, ìèíóò, ñåêóíä è ìèëèñåêóíä ïðîøåäøèõ ìåæäó äâóìÿ     }
{ îòðåçêàìè âðåìåíè.                                          }
{*************************************************************}
{ PROPERTIES:                                                 }
{  StartTime, EndTime: TDateTime; - Range of time interval.   }
{ READ ONLY PROPERTIES:                                       }
{  Years: LongInt                                             }
{  Months: LongInt                                            }
{  Days: LongInt                                              }
{  Hours: LongInt                                             }
{  Minutes: LongInt                                           }
{  Seconds: LongInt                                           }
{  MSeconds: LongInt                                          }
{*************************************************************}
{ Please see demo program for more information.               }
{*************************************************************}
{                     IMPORTANT NOTE:                         }
{ This software is provided 'as-is', without any express or   }
{ implied warranty. In no event will the author be held       }
{ liable for any damages arising from the use of this         }
{ software.                                                   }
{ Permission is granted to anyone to use this software for    }
{ any purpose, including commercial applications, and to      }
{ alter it and redistribute it freely, subject to the         }
{ following restrictions:                                     }
{ 1. The origin of this software must not be misrepresented,  }
{    you must not claim that you wrote the original software. }
{    If you use this software in a product, an acknowledgment }
{    in the product documentation would be appreciated but is }
{    not required.                                            }
{ 2. Altered source versions must be plainly marked as such,  }
{    and must not be misrepresented as being the original     }
{    software.                                                }
{ 3. This notice may not be removed or altered from any       }
{    source distribution.                                     }
{*************************************************************}
unit DTCalc;

interface

uses
  {$IFDEF Win32} Windows, {$ELSE} WinTypes, WinProcs, {$ENDIF}
  SysUtils, Classes;

type
  TDTCalc = class(TComponent)
  private
    FStartTime, FEndTime: TDateTime;
    FYears, FMonths, FDays, FHours, FMinutes, FSeconds, FMSeconds: LongInt;
    procedure SetStartTime(Value: TDateTime);
    procedure SetEndTime(Value: TDateTime);
    procedure Calculate;
  public
  published
    property StartTime: TDateTime read FStartTime write SetStartTime;
    property EndTime: TDateTime read FEndTime write SetEndTime;
    property Years: LongInt read FYears;
    property Months: LongInt read FMonths;
    property Days: LongInt read FDays;
    property Hours: LongInt read FHours;
    property Minutes: LongInt read FMinutes;
    property Seconds: LongInt read FSeconds;
    property MSeconds: LongInt read FMSeconds;
  end;

procedure Register;

implementation

{$R *.RES}

procedure TDTCalc.SetStartTime(Value: TDateTime);
begin
  FStartTime := Value;
  Calculate;
end;

procedure TDTCalc.SetEndTime(Value: TDateTime);
begin
  FEndTime := Value;
  Calculate;
end;

procedure TDTCalc.Calculate;
var
  e: Extended;
  TempStr: String;

  procedure Truncate(var Value: LongInt);
  begin
    try
     Value := Trunc(e);
    except
     Value := -1;
    end;
  end;

begin
  e := MSecsPerDay * (FEndTime - FStartTime);
  Truncate(FMSeconds);
  TempStr := IntToStr(FMSeconds);
  if TempStr[Length(TempStr)] = '9' then inc(FMSeconds); 
  e := e / 1000;
  Truncate(FSeconds);
  e := e / 60;
  Truncate(FMinutes);
  e := e / 60;
  Truncate(FHours);
  e := e / 24;
  Truncate(FDays);
  FMonths := Trunc((FEndTime - FStartTime) / 30.4375);
  FYears := Trunc((FEndTime - FStartTime) / 365.25);
end;

procedure Register;
begin
  RegisterComponents('ESC', [TDTCalc]);
end;

end.
------------------------------------------
como usar o componente
------------------------------------------
    DTCalc1.StartTime := dataset.FieldByName('nascimento').AsDateTime;
    DTCalc1.EndTime := now;
    dataset.FieldByName('idade').AsInteger := DTCalc1.Years;
--------------------------------------------

Link para o comentário
Compartilhar em outros sites

  • 0

Tá legal s3c,

Vou tentar mecher na minha rotina no final de semana com mais calma.

Qualquer coisa falo com você.

A propósito, quando estava escrevendo um colega(Escobar) passou uma rotina.

Não li ainda.

Você já leu?

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Paulo, pelo que entendí do código exposto pelo Escobar, o componente calcula cada variável(anos,meses,dias,horas,min,seg,mseg) individualmente pela diferença das duas datas; ou seja; se você pedir a qtde de meses entre 5 anos, ele retorna 60.

Link para o comentário
Compartilhar em outros sites

  • 0

é isso mesmo s3c, se pedir o tempo entre 5 anos = 60 meses...

acho o que ele quer é tempo decorrido, tipo, tantos anos, meses, dias, horas, minutos, segundos... heheheh como eu só precisava do tempo em anos, a minha já matou a pau...

Link para o comentário
Compartilhar em outros sites

  • 0

ta em visual-basic e num sei se funciona porque nunca testei, facil de converter para delphi......

Private Function diferença_datas(Dtini As Date, Dtfin As Date)

1 If IsNull(Dtini) Or Dtini > Now Or Dtini > Dtfin Then
2 MsgBox "Data inválida !", vbCritical, "Data Inválida"
3 Exit Function
4 End If

5 diferenca = Dtfin - Dtini

6 xAnos = diferenca / 365.25
7 anos = Int(xAnos)
8 xMeses = (xAnos - anos) * 12
9 meses = Int(xMeses)

10 dias = DateDiff("d", DateSerial(DatePart("yyyy", Dtini) + anos, _
DatePart("m", Dtini) + meses, Day(Dtini)), Dtfin)

Link para o comentário
Compartilhar em outros sites

  • 0

Odeio quando isso acontece... a função tava incompleta na pagina, mas tinha um arquivo com ela completinha, ai desculpem a falha...

Private Function diferença_datas(Dtini As Date, Dtfin As Date)

    If IsNull(Dtini) Or Dtini > Now Or Dtini > Dtfin Then
       MsgBox "Data inválida !", vbCritical, "Data Inválida"
       Exit Function
    End If
    
    diferenca = Dtfin - Dtini

    xAnos = diferenca / 365.25
    anos = Int(xAnos)
    xMeses = (xAnos - anos) * 12
    meses = Int(xMeses)
    
    dias = DateDiff("d", DateSerial(DatePart("yyyy", Dtini) + anos, _
           DatePart("m", Dtini) + meses, Day(Dtini)), Dtfin)

    If dias = 30 Then
      dias = 0
    End If
    
    If meses = 12 Then
      meses = 0
      anos = anos + 1
    End If
    
    If anos > 1 Then
      anos = anos & " anos "
    Else
      anos = anos & " ano "
    End If
    
    If meses > 1 Then
      meses = meses & " meses "
    Else
      meses = meses & " mês "
    End If
    
    If dias > 1 Then
       dias = dias & " dias "
    Else
      dias = dias & " dias "
    End If
    
    diferença_datas = anos & meses & dias
    
End Function

sad.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Boas pessoal...

Eu reparei no codigo do ESCOBAR e reparei que talvez fosse aquilo q preciso mas como eu sou novo no visual basic eu n saberia como colocar esse codigo e o que colocar no form e aproveitando o assunto sobre as datas eu aproveito e peco ajuda sobre a questao e se m puderem ajudar como fazer agradecia muito...

então ca vai:

eu preciso saber como posso calcular a diferenca entre duas datas:

eu estou a tirar um curso de informatica nivel 3 numa escola profissional e a parte eu tento aprender programacao e então tive uma ideia que depois passo explicar:

eu estou a estagiar numa empresa de informatica e reparei que esta vende como produto antivirus (kaspersky) a muitos clientes so que esta tem um inconveniente ou n... (e aqui surge a minha ideia) e esta empresa nunca sabe kuando é que as licensas de determinados clientes irão expirar e sabendo isso eu queria criar um codigo (programa) que compara-se a data_inicio da licença com a data_expiracao menos(-) 10 dias ou seja:

resumidamente eu keria k kuando a licença estivesse 10 dias entes de expirar k m mostra-se uma mensagem de aviso e m envia-se um mail a dizer k determinada licença de determinado cliente iria expirar depois desses 10 dias.

eu reparei no codigo do escobar prk é para visual basic e visto que estou a fazer o programa em visual basic 2005 express edition mas s m poderem arranjar so em vb6 n m importo...

pessoal espero n estar a abusar da vossa generosidade prk n é minha intenção a minha intenção é aprender a programar sobre ideias k tenha e por isso eu peco a vossa ajuda...se m quiserem contactar-me o meu mail é este:

fabio1estrela@hotmail.com

espero k m possam ajudar e desde já agradeco a todos....

abracos...

Editado por so_free
Link para o comentário
Compartilhar em outros sites

  • 0
Eu reparei no codigo do ESCOBAR e reparei que talvez fosse aquilo q preciso mas como eu sou novo no visual basic eu n saberia como colocar esse codigo e o que colocar no form e aproveitando o assunto sobre as datas eu aproveito e peco ajuda sobre a questao e se m puderem ajudar como fazer agradecia muito...

so_free, você disse "sou novo no visual basic". Este é o forum de Delphi/Kylix, se a dúvida for mesmo em VB informe-nos que moveremos para a sessão correta.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Boas Micheus e Pessoal...

Eu aproveitei e postei a minha duvida sobre DATAS em Vb aki (area Delphi) porque o Escobar colocou um codigo em vb sobre aquilo que eu pretendo mas para traduzir para Delphi

citação de Escobar:

--->ta em visual-basic e num sei se funciona porque nunca testei, facil de converter para delphi......

Micheus eu n m importo k mudem para a sessão correcta (visual basic) e eu ate agradeco...

Eu so coloquei aqui a minha duvida pelo que referi anteriormente e pelo facto do assunto

ser quase aquilo que pretendo...

Micheus e pessoal s m puderem ajudar na minha duvida eu agradecia desde já....

Abracos pessoal...

Link para o comentário
Compartilhar em outros sites

  • 0
Eu aproveitei e postei a minha duvida sobre DATAS em Vb aki (area Delphi) porque o Escobar colocou um codigo em vb sobre aquilo que eu pretendo mas para traduzir para Delphi
so_free observe que a função faz uso uma aproximação do ano (365,25) para os cálculos.

Se o objetivo for obter o tempo exato decorrido entre as datas, ela não tem tal precisão. Serviria mais a título de informação, não leva em conta a passagem de um ano bisexto, por exemplo (esses 0,25 é justamente o dia a mais a cada 4 anos, ou seja, 0,25 dias a mais por ano).

Segue, então, a tradução ao "pé da letra":

Function diferenca_datas(Dtini, Dtfin :TDate) :string;
var
  xAnos,
  xMeses,
  diferenca :Double;
  dias,
  anos,
  meses :Integer;
begin
  If (Dtini = 0) Or (Dtini > Date) Or (Dtini > Dtfin) Then
  Begin
    MessageDlg('Data inválida !', mtError, [mbOk], 0);
    Exit;
  End;

  diferenca := Dtfin - Dtini;

  xAnos := diferenca / 365.25;
  anos := Trunc(xAnos);
  xMeses := (xAnos - anos) * 12;
  meses := Trunc(xMeses);

  dias := DaysBetween(EncodeDate(YearOf(Dtini) + anos, MonthOf(Dtini) + meses, DayOf(Dtini)), Dtfin);

   If dias = 30 Then
     dias := 0;

   If meses = 12 Then
   Begin
     meses := 0;
     anos := anos + 1
   End;

   If anos > 1 Then
     Result := IntToStr(anos) + ' anos '
   Else
     Result := IntToStr(anos) + ' ano ';

   If meses > 1 Then
     Result := Result + IntToStr(meses) + ' meses '
   Else
     Result := Result + IntToStr(meses) + ' mês ';

   If dias > 1 Then
      Result := Result + IntToStr(dias) +' dias '
   Else
     Result := Result + IntToStr(dias) +' dias ';
End;

Obs.: voce deve acrescentar a unit DateUtils na cláusula Uses.

Micheus eu n m importo k mudem para a sessão correcta (visual basic) e eu ate agradeco...
Cara, você quer dar um nó na minhas idéias. :wacko:

Sua dúvida não era justamente na conversão da função VB para Delphi? :huh:

Link para o comentário
Compartilhar em outros sites

  • 0

OLÁ!

Sou um daqueles que procurou muito na net alguma função para destrinchar um intervalo de datas em dias, meses e anos de forma precisa. Já tentei muita coisa, e até converti uma função em PHP, mas todas elas tinham falhas. A que menos falhou foi a que converti do PHP.

Aqui você escreveu que desenvolveu uma função para realizar a tal tarefa, e além disso, até o momento da postagem, você disse que ela tem sido precisa.

Você também tentou explicar como proceder, mas eu sinceramenten não entendi bem. Você também diz que a única forma de conseguir precisão é trabalhando separadamente com anos, meses e dias, fato que eu pude comprovar durante minhas pesquisas, mas que não tive capacidade para concluir.

Em fim, poderia por gentileza enviar-me a função (pode ser em Delphi mesmo) de forma que eu possa estudá-la, usá-la e atualizá-la?

Eu pretendo modificar para que ela retorne a informação com uma precisão de segundos ou mesmo milissegundos. Acredito que se eu conseguir entender o que você fez para anos, meses e dias, conseguirei desenvolver o restante da mesma.

A função concluída eu te enviarei de volta, de forma que você também possa usufruir da mesma.

Obrigado, antecipadamente.

Olá Paulo, bom a rotina que fiz pode não ser a mais otimizada em termos de código, mas é por aí:
se Ano Final > Ano Inicial

temos uma situação,caso MesFinal > MesInicial, se Ano Final =Ano Inicial, outra

Fiz ± assim também:
if Dti >= Dtf then
  Exit; // datas inválidas 
Anos := Anof - Anoi - 1;
if (Mesi < Mesf)
 or
   ((Mesi = Mesf) and (Diai <= Diaf)) then
  Inc(Anos);

O próximo passo é apurar os meses nas duas situações:

if (Mesi <> Mesf) or ((Mesi = Mesf) and (Diai > Diaf))

além de ter que dividir em vários casos se MesFinal for março, maio etc..(por causa dos 31 dias), MesFinal for fevereiro(bissexto ou não), claro também analisando os casos do MesInicial.
Quando programava em Cobol, tive que fazer assim; tendo uma tabela de

31 00 31 30 31 30 31 31 30 31 30 31 e atualizando o segundo ítem p/ 28 ou 29(vale uma dica p/ quem não souber que um ano é bissexto quando for divisível por 4 e se for divisível por 100 tem que ser divisível por 400); mas no Delphi otimizei um pouco porque você pode montar a data pelo EncodeDate e ir incrementando de 1 em 1 que automaticamente ela muda de mes(quando você adiciona um inteiro a um TDatetime, você está adicionando dias).

É isso tudo mesmo?
Bom, ao menos p/ mim tive que escrever código p/ prever todas as variantes possíveis; não posso garantir que essa rotina esteja exata, mas pelas datas apuradas até agora, ela retornou resultados precisos.

Se você tiver muita dificuldade em desenvolvê-la, me passe seu email que eu te mando; assim conto c/ sua contribuição p/ detectar algum bug p/ poder corrigí-lo.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

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