Mostrando entradas con la etiqueta DateUtils. Mostrar todas las entradas
Mostrando entradas con la etiqueta DateUtils. Mostrar todas las entradas

domingo, 3 de septiembre de 2017

Diferencia horaria entre dos fechas

El tipo TDateTime es un número del tipo Double cuya parte entera se utiliza para la parte de la fecha y la parte fraccionaria para la hora.

Free Pascal dispone de una gran cantidad de funciones para el tratamiento de fechas y horas en la unidad dateutils.

En este ejemplo solo veremos como calcular la diferencia horaria, la parte time, de dos TDateTime y también la cantidad de horas entre dos fechas también del tipo TDateTime.


Lo primero que notamos es que el cálculo del tiempo transcurrido entre las 19:00 y 02:27 es correcto, 7 horas y 27 minutos.
Lo segundo, es que si se tomarán en cuenta los días de las fechas, las horas transcurridas serían 55 y 27 minutos.
Lo tercero, la cantidad de horas es correcta, 55, pero se ignoran los minutos.

Pero según lo que se necesite, esto puede servir o resultar insuficiente, en tal caso, hay que buscar la combinación de funciones que nos resuelvan el tema y de última siempre están las funciones Decode* y Encode* mediante las cuales, podemos hacer lo que queramos, aunque deberemos escribir más código.

El código del ejemplo:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
    Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, dateutils;

type

        { TForm1 }

    TForm1 = class(TForm)
                btnDiferencia: TButton;
                btnCantidad: TButton;
                Label1: TLabel;
                Label2: TLabel;
                Label3: TLabel;
                Label4: TLabel;
                procedure btnCantidadClick(Sender: TObject);
    procedure btnDiferenciaClick(Sender: TObject);
    private
        fechainicio, fechafin:TDateTime;
        { private declarations }
    public
        { public declarations }
    end;

var
    Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.btnDiferenciaClick(Sender: TObject);
var
  Diferencia:TDateTime;
begin
  fechainicio:=StrToDateTime('05-07-2017 19:00');
  fechafin:=StrToDateTime('08-07-2017 02:27');
  Diferencia:=fechafin-fechainicio;
  Label3.Caption:=TimeToStr(TimeOf(Diferencia));
end;

procedure TForm1.btnCantidadClick(Sender: TObject);
var
  canthoras:Int64;
begin
  fechainicio:=StrToDateTime('05-07-2017 19:00');
  fechafin:=StrToDateTime('08-07-2017 02:27');
  canthoras:=HoursBetween(fechafin,fechainicio);
  Label4.Caption:=IntToStr(canthoras);
end;

end.

La función TimeOf recibe como parámetro un valor del tipo TDateTime y retorna la parte horaria, es decir, le pasamos un TDateTime y nos devuelve un TTime, por tal motivo utilizamos TimeToStr en lugar DateTimeToStr.

La función HoursBetween recibe como parámetros dos valores del tipo TDateTime y retorna un valor del tipo Int64 que serán la cantidad de horas entre las fechas.

Código fuente: Diferencia horaria entre fechas.7z

o en GitLab

sábado, 2 de septiembre de 2017

Comparar horas

CompareTime es un función que nos permite comparar tiempo entre dos valores del tipo TDateTime o TTime. Si el valor es del tipo TDateTime, la parte del valor correspondiente a la fecha, es ignorada.

Esta función se encuentra en DateUtils por lo tanto debe agregarse en uses.

La función recibe como parámetros dos constantes del tipo TDateTime y devuelve un TValueRelationship cuyos valores están en el rango -1..1

function CompareTime ( const A: TDateTime; const B: TDateTime ) : TValueRelationship;

Definición según la wiki de Free Pascal.

Los parámetros aceptados son tanto del tipo TDateTime como TTime.

Si los valores son iguales, entonces devuelve 0 (cero).

Si el primer valor es anterior o más temprano que el segundo, entonces devuelve un valor menor a 0 (cero), es decir, negativo.

Si el primer valor es posterior o más tarde que el segundo, entonces devuelve un valor mayor a 0 (cero), es decir, positivo.

El valor retornado por la función puede almacenarse en una variable del tipo Integer y si bien la documentación habla de valores mayores, iguales o menores a 0 (cero), siendo del tipo entero entonces solo debería retornar 1, 0 o -1.

Ejemplo:


Código:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
    Classes, SysUtils, FileUtil, DateTimePicker, Forms, Controls, Graphics, dateutils,
        Dialogs, StdCtrls;

type

        { TForm1 }

    TForm1 = class(TForm)
                btnComparar: TButton;
                DateTimePicker1: TDateTimePicker;
                DateTimePicker2: TDateTimePicker;
                Label1: TLabel;
                Label2: TLabel;
                Memo1: TMemo;
                procedure btnCompararClick(Sender: TObject);
    private
        { private declarations }
    public
        { public declarations }
    end;

var
    Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.btnCompararClick(Sender: TObject);
begin
   CASE CompareTime(DateTimePicker1.Time,DateTimePicker2.Time) of
     1 : Memo1.Append('Llegó temprano');
     0 : Memo1.Append('Llego en horario.');
    -1 : Memo1.Append('Llegó tarde.');
     end;
end;

end.     

Descargar el código (.pas y .lfm): CompareTime.7z