Somar dias a data em fevereiro dá errado.

Delphi

02/03/2006

Galera.

Como faço para somar 30 dias a data de hoje considerando se o ano é bisexto ou não.

Fiz assim

A data é 02/02/2006 e o pagamento é daqui a trinta dias

Data:=DateToStr(date+30)

dá 04/03/2006 em vez de dar 02/03/2006

Por favor e muito obrigado


Dr. Interbase

Dr. Interbase

Curtidas 0

Respostas

Massuda

Massuda

02/03/2006

Use IncMonth ao invés de somar 30 dias; o que você quer é pagamentos mensais, não pagamentos a cada 30 dias.


GOSTEI 0
Dr. Interbase

Dr. Interbase

02/03/2006

Eu sei, mas pode ser que o usuario digite 7 ao inves de 30. O 30 que usei é mero exemplo. Tenho clientes que usam 15, 7 e etc.

Obrigado


GOSTEI 0
Weber

Weber

02/03/2006

Neste caso use IncDay.

É necessário declarar a Unit DateUtils.


GOSTEI 0
Massuda

Massuda

02/03/2006

[quote:d33b6f571c=´Dr. Interbase´]Tenho clientes que usam 15, 7 e etc. [/quote:d33b6f571c]Nesse caso, matematicamente o certo seria somar o número de dias. Não tem 30 dias entre 2/3/06 e 2/2/06...


GOSTEI 0
Dr. Interbase

Dr. Interbase

02/03/2006

Gente usei isto aqui, botei a data do computador como 02 de fevereiro

Data:=Date+IncDay(StrToInt(Edt_Prazo1.Text));

Edt_Prazo1.text tem 30

E está dando 05/03/2006
Quando deveria dar 02/03/2006 porque fevereiro tem 28 dias

E aï ???

Muito obrigado


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

02/03/2006

[quote:6436b93670=´Dr. Interbase´]Gente usei isto aqui, botei a data do computador como 02 de fevereiro

Data:=Date+IncDay(StrToInt(Edt_Prazo1.Text));

Edt_Prazo1.text tem 30

E está dando 05/03/2006
Quando deveria dar 02/03/2006 porque fevereiro tem 28 dias

E aï ???

Muito obrigado[/quote:6436b93670]
Colega,

Nestes casos, costumo colocar uma mensagem de confirmação para o usuário decidir se são trinta dias ou um mês. No mais, o tópico já possui toda a informação necessária para este tipo de implementação.


GOSTEI 0
Dr. Interbase

Dr. Interbase

02/03/2006

Gente usei isto, onde edt_prazo1 tem 30

Coloquei a data do sistema como 02/02/2006

Data:=Date+incday(StrToInt(Edt_Prazo1.Text));

e ao inves de dar 02/03/2006 dá 05/03/2006


Obrigado


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

02/03/2006

Colega,

Vê se isto ajuda:

var Prazo: SmallInt;
begin
  Prazo := StrToInt(edtDIAS.Text);
  if Prazo=30 then
    IncMonth(...)
  else
    IncDay(...)
end;



GOSTEI 0
Dr. Interbase

Dr. Interbase

02/03/2006

Deu isso

if forMensal then
data:=Data+incmonth(1)
Else
Data:=Date+incDay(15);

Fiz mensal e ela não considera 28 dias, dá na mesma 05/03/2006
quando deveria dar 02/03/2006


Obrigado


GOSTEI 0
Rjun

Rjun

02/03/2006

Esse comportamento que você quer parece-me estranho. O usuário informa o periodo em dias, mas você não quer adicionar dias na data e sim o espaço de 1 mês se o número de dias for 30? É isso? Veja bem, se você adicionar 30 dias em uma data que esteja em um mês com 31 dias, o dia não sera o mesmo:

Exemplo:
02/01/2006 + 30 dias : 01/02/2006


GOSTEI 0
Dr. Interbase

Dr. Interbase

02/03/2006

Gente até agora nenhuma das opções acima funcionou



Por favor ajudem


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

02/03/2006

Colega,

function DataVencimento(DataAtual: TDateTime; PrazoEmDias: Integer): TDateTime;
var Ano, Mes, Dia: Word;
begin

  DecodeDate(DataAtual, Ano, Mes, Dia);

if PrazoEmDias=30 then
  begin
    Inc(Mes);
    if Mes=13 then
    begin
  Mes := 1;
      Inc(Ano);
    end;
    Result := EncodeDate(Ano, Mes, Dia);
  end else
  begin
    Result := IncDay(DataAtual, PrazoEmDias);
  end;

end;


Talvez precise de alguns ´retoques´.


GOSTEI 0
Rjun

Rjun

02/03/2006

Ainda mantenho minha pergunta. O usuário pode informar qualquer valor em dias? Se ele informar 30, deve-se acrescentar 1 mês direto?


GOSTEI 0
Sanses

Sanses

02/03/2006

Oi

Olha, não sei pq teria que ser assim, como os colegas já mencionaram acima, 30 dias em 2/2/2006 jamais podeira dar 2/3/2006 por questões obvias (ao meu ver é a mesma coisa que querer dizer que o resultado de 2 + 2 seja 5 :D ), mas veja se assim funciona:
uses Dateutils;
...
var
  dias : integer;
  diasInc : TDate;
begin
  dias := DaysInMonth(DateTimePicker1.Date);
  diasInc := DateTimePicker1.Date + dias;
  showmessage(datetostr(diasInc));
end;


Primeiro pegamos a quantidade de dias do mês em questão e armazenamos na variável DIAS. Após é só somar a quantidade de dias com a sua data inicial e obterá o resultado como quer...

Com este código voce consegue resolver o problema da data cais no mesmo dia ´base´. A função para 15 ou 7 dias é simples, restando agora apenas implementar esta função e testar qual deve ser utilizada.

[]´s
Sanses


GOSTEI 0
Dr. Interbase

Dr. Interbase

02/03/2006

Galera, muito obrigado a todos, posto aqui a soluçào que encontrei baseado na ajuda que os amigos forneceram. Façam isto que funciona muito bem.

function DataVencimento(DataAtual: TDateTime; PrazoEmDias: Integer): TDateTime;
var Dias:integer;
data:Tdate;
begin
If daysinmonth(DataAtual)=31 Then
Data:=(DataAtual-(31-daysinmonth(DataAtual))+PrazoEmDias)
Else
Data:=(DataAtual-(30-daysinmonth(DataAtual))+PrazoEmDias);
Result := Data;
end;


Obrigado


GOSTEI 0
POSTAR