Somar dias a data em fevereiro dá errado.
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
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
Curtidas 0
Respostas
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
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
Obrigado
GOSTEI 0
Weber
02/03/2006
Neste caso use IncDay.
É necessário declarar a Unit DateUtils.
É necessário declarar a Unit DateUtils.
GOSTEI 0
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
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
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
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.
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
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
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
02/03/2006
Colega,
Vê se isto ajuda:
Vê se isto ajuda:
var Prazo: SmallInt; begin Prazo := StrToInt(edtDIAS.Text); if Prazo=30 then IncMonth(...) else IncDay(...) end;
GOSTEI 0
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
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
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
Exemplo:
02/01/2006 + 30 dias : 01/02/2006
GOSTEI 0
Dr. Interbase
02/03/2006
Gente até agora nenhuma das opções acima funcionou
Por favor ajudem
Por favor ajudem
GOSTEI 0
Aroldo Zanela
02/03/2006
Colega,
Talvez precise de alguns ´retoques´.
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
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
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:
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
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
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
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