Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema calcular meses , dias entre rango de fechas (https://www.clubdelphi.com/foros/showthread.php?t=85397)

shoulder 12-03-2014 16:05:37

Problema calcular meses , dias entre rango de fechas
 
Encontre esta funcion de calculo de edad, que la adapte para el calculo de meses y dias solo cambiando DATE por una variable, pero me parece que en esa funcion hay un error cuando el mes es febrero porque hace
DiasFinales = (Dias Iniciales -Dias del ultimo mes);
y si resto 24/02/2014 - 31/12/2014 me da 10 meses y 7 dias pero esta mal son y 5 días y de la funcion no cambie nada. Estoy equivocado?.

Cita:



function CalculaEdadCompleta(Fecha, Fecha1:TDateTime):String;
var A, AA, M, MM, D, DD: Word;
Anio, Mes, Dia: double;
begin
DecodeDate(Fecha, A, M, D);
DecodeDate(Fecha1, AA, MM, DD);
Anio := Int(AA - A);
if( M <= MM ) then
Mes := MM - M
else
begin
Mes := MM+12-M;
Anio := Anio -1;
end;
if( D <= DD ) then
Dia := DD - D
else
begin
Dia:=DD+MonthDays[IsLeapYear(AA),MM]-D;
Mes := Mes -1;
end;
if Mes < 0 then
begin
Anio := Anio - 1;
Mes := 12 + Mes;
end;
Result := Format('Años: %.0f, Meses: %.0f, Dias: %.0f', [Anio, Mes, Dia]);
end;






cloayza 12-03-2014 19:48:44

Amigo el cálculo está bien...

La lógica es la siguiente:

Tu fecha inicial es 24/02/2014, es decir todos los días 24 de cada mes Cumple Mes :D....

Si hacemos el cálculo a mano tendriamos
24 de marzo -> 1
24 de Abril -> 2
...
24 de Diciembre -> 10

Como la fecha final es 31 de Diciembre entonces hay que sumarle la diferencia entre el 31 de Diciembre y 24 de Diciembre que es...7 días.

Puedes corroborar este cálculo en la cálculadora de Windows Calc.Exe, bajo la opción "Ver->Cálculo de Fecha", selecciona de la combobox "Calcular la diferencia entre dos fechas"...

Saludos cordiales

nlsgarcia 12-03-2014 20:15:12

shoulder,

Cita:

Empezado por shoulder
...Encontré esta función de calculo de edad, que la adapte para el calculo de meses y días...si resto 24/02/2014 - 31/12/2014 me da 10 meses y 7 días pero esta mal son 5 días...¿Estoy equivocado?...

El valor que obtienes es correcto, del 24/02 al 24/12 hay 10 meses, del 24/12 al 31/12 hay 7 días.

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    DateTimePicker1: TDateTimePicker;
    DateTimePicker2: TDateTimePicker;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function CalculateLapseDate(FechaI, FechaF : TDateTime) : String;
var
   AAI, AAF, MMI, MMF, DDI, DDF: Word;
   AA, MM, DD: Integer;

begin

   DecodeDate(FechaI, AAI, MMI, DDI);
   DecodeDate(FechaF, AAF, MMF, DDF);

   AA := AAF - AAI;

   if( MMI <= MMF ) then
      MM := MMF - MMI
   else
   begin
      MM := MMF + 12 - MMI;
      AA := AA - 1;
   end;

   if( DDI <= DDF ) then
      DD := DDF - DDI
   else
   begin
      DD := DDF + MonthDays[IsLeapYear(AAF),MMF] - DDI;
      MM := MM - 1;
   end;

   if MM < 0 then
   begin
      AA := AA - 1;
      MM := 12 + MM;
   end;

   Result := Format('%.0d Años %.0d Meses y %.0d Dias', [AA, MM, DD]);

end;


procedure TForm1.Button1Click(Sender: TObject);
var
   FechaI, FechaF : TDateTime;
   Msg : String;
   AuxFechaI, AuxFechaF : String;

begin

   FechaI := DateTimePicker1.DateTime;
   FechaF := DateTimePicker2.DateTime;

   Msg := CalculateLapseDate(FechaI, FechaF);

   DateTimeToString(AuxFechaI,'yyyy/mm/dd',FechaI);
   DateTimeToString(AuxFechaF,'yyyy/mm/dd',FechaF);

   Msg := Format('Entre %s y %s han trancurrido: %s',
                 [AuxFechaI, AuxFechaF, Msg]);

   MessageDlg(Msg,mtInformation,[mbOK],0);

end;

end.
El código anterior permite calcular el rango de años, meses y días transcurridos desde una fecha inicial hasta una fecha final, como se muestra en la siguiente imagen:



Espero sea útil :)

Nelson.

shoulder 12-03-2014 20:34:50

Calculo Rango fechas
 
Primero Gracias!!!, segundo el error (mio de interpretacion) es que necesito hacer el calculo a nivel laboral de pago (dias trabajados) por eso la funcion me fallaba.

Tiene que ser dias trabajados del 24/02 al 28/02/2014 y 10 meses hasta el 31/12/2014. POR ESO SON 10 MESES Y 5 DIAS.

En vez un cumpleaños es como me explican ustedes (10 meses y 7 dias) en realidad tengo que adaptar la funcion.


La franja horaria es GMT +2. Ahora son las 00:49:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi