Fórum extrair meses no delphi #222818
27/03/2004
0
Valeu gente!!!
Universodosoftware
Curtir tópico
+ 0Post mais votado
28/03/2004
O fontes da função MonthsBetween da DateUtils da RxLib é este aqui:
function MonthsBetween(Date1, Date2: TDateTime): Double;
var
D, M, Y: Word;
begin
DateDiff(Date1, Date2, D, M, Y);
Result := 12 * Y + M;
if (D > 1) and (D < 7) then Result := Result + 0.25
else if (D >= 7) and (D < 15) then Result := Result + 0.5
else if (D >= 15) and (D < 21) then Result := Result + 0.75
else if (D >= 21) then Result := Result + 1;
end;
procedure DateDiff(Date1, Date2: TDateTime; var Days, Months, Years: Word);
{ Corrected by Anatoly A. Sanko (2:450/73) }
var
DtSwap: TDateTime;
Day1, Day2, Month1, Month2, Year1, Year2: Word;
begin
if Date1 > Date2 then begin
DtSwap := Date1;
Date1 := Date2;
Date2 := DtSwap;
end;
DecodeDate(Date1, Year1, Month1, Day1);
DecodeDate(Date2, Year2, Month2, Day2);
Years := Year2 - Year1;
Months := 0;
Days := 0;
if Month2 < Month1 then begin
Inc(Months, 12);
Dec(Years);
end;
Inc(Months, Month2 - Month1);
if Day2 < Day1 then begin
Inc(Days, DaysPerMonth(Year1, Month1));
if Months = 0 then begin
Dec(Years);
Months := 11;
end
else Dec(Months);
end;
Inc(Days, Day2 - Day1);
end;
function DaysPerMonth(AYear, AMonth: Integer): Integer;
const
DaysInMonth: array[1..12] of Integer =
(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
begin
Result := DaysInMonth[AMonth];
if (AMonth = 2) and IsLeapYear(AYear) then Inc(Result); { leap-year Feb is special }
end;
function IsLeapYear(AYear: Integer): Boolean;
begin
Result := (AYear mod 4 = 0) and ((AYear mod 100 <> 0) or (AYear mod 400 = 0));
end;
Aroldo Zanela
Gostei + 1
Mais Posts
27/03/2004
Aroldo Zanela
Veja este tópico: http://delphiforum.icft.com.br/forum/viewtopic.php?t=36022&highlight=monthsbetween
Gostei + 0
27/03/2004
Marco Salles
O Problema Aroldo, Que Neste Tópico o :idea: Emerson Sugeriu Uma Rotina Muito Interressante :P Para Definir A Quantidade De Meses Entre Duas Datas,[size=14:9d3e26b314] Mas Ate o Momento :cry: :cry: as Mensagems Do Emerson Sumiram Do Forum...[/size:9d3e26b314]Se O Nosso Amigo ´universodosoftware´ Ler Este Tópico, Ele Vai Ficar Meio Confuso :?: Quem é Este Ermerson :?: Qual é a Rotina Que Ele Sugeriu..etc... :?: :?: Falndo Nisso Aroldo, Não Dá Para Voltar Com as Mensagems Do Nosso Amigo, :?: Ainda Bem Que Não Foram as Minhas Mensagems Estã Em Cima :P :P :P
Gostei + 0
27/03/2004
Aroldo Zanela
O Problema Aroldo, Que Neste Tópico o :idea: Emerson Sugeriu Uma Rotina Muito Interressante :P Para Definir A Quantidade De Meses Entre Duas Datas,[size=14:b5f7cb8391] Mas Ate o Momento :cry: :cry: as Mensagems Do Emerson Sumiram Do Forum...[/size:b5f7cb8391]Se O Nosso Amigo ´universodosoftware´ Ler Este Tópico, Ele Vai Ficar Meio Confuso :?: Quem é Este Ermerson :?: Qual é a Rotina Que Ele Sugeriu..etc... :?: :?: Falndo Nisso Aroldo, Não Dá Para Voltar Com as Mensagems Do Nosso Amigo, :?: Ainda Bem Que Não Foram as Minhas Mensagems Estã Em Cima :P :P :P[/quote:b5f7cb8391]
Muito estranho! Não havia percebido isso, mas vou investigar pra ver se descrubo o que está acontecendo.
Gostei + 0
28/03/2004
Marco Salles
function MesesEntreDatas(dDataInicial, dDataFinal: TDate): integer; var Anosi, Mesesi, Diasi: integer; Anosf, Mesesf, Diasf: integer; Anos, Meses, Dias: Word; begin DecodeDate(dDataInicial,Anos,Meses,Dias); anosi:=Anos; Mesesi:=Meses; DiasI:=Dias; Decodedate(dDataFinal,Anos,Meses,Dias); anosF:=Anos; MesesF:=Meses; DiasF:=Dias; AnosF:=Abs(AnosF-AnosI); MesesF:=(MesesF-Mesesi); DiasF:=(DiasF-Diasi); if MesesF < 0 Then begin Dec(AnosF); Inc(MesesF,12); end; if DiasF < 0 then Dec(MesesF); Result :=abs(MesesF + (AnosF * 12)); end;
Experimente:
Var DiferencaDeMeses:Integer; begin DiferencaDeMeses:=MonthsBetween(01/02/2003,01/03/2003); ShowMessage(IntToStr(DiferencaDeMeses)); DiferencaDeMeses:=MesesEntreDatas(01/02/2003,01/03/2003); ShowMessage(IntToStr(DiferencaDeMeses)); end;
Gostei + 0
28/03/2004
Marco Salles
function MesesEntreDatas(dDataInicial, dDataFinal: TDate): integer; var AnoI, MesI, DiaI, AnoF, MesF, DiaF: word; Anos, Meses, Dias: integer; dDataIni, dDataFim: TDate; begin if dDataInicial < dDataFinal then begin dDataIni := dDataInicial; dDataFim := dDataFinal; end else begin dDataIni := dDataFinal; dDataFim := dDataInicial; end; DecodeDate(dDataIni,AnoI,MesI,DiaI); Decodedate(dDataFim,AnoF,MesF,DiaF); Anos := AnoF - AnoI; Meses := MesF - MesI; Dias := DiaF - DiaI; if Meses < 0 then begin Inc(Meses,12); Dec(Anos); end; if Dias < 0 then Dec(Meses); Result := Meses + (Anos * 12); end;
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)