Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-05-2022
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Extraño resultado de la función "DateUtils.MinutesBetween"

Hola a todos,

A ver si alguien sabría decirme a qué se debe el siguiente extraño resultado utilizando la función de la unidad DateUtils "MinutesBetween":

Código Delphi [-]
var
  DateTimeA, DateTimeB: TDateTime;
begin
  DateTimeA := EncodeDateTime(2022, 1, 1, 10, 0, 0, 0);
  DateTimeB := EncodeDateTime(2022, 1, 1, 11, 0, 0, 0);

  // Muestra 60, lo que en principio parece el resultado esperado
  ShowMessage(IntToStr(MinutesBetween(DateTimeA, DateTimeB)));
end;
...
Código Delphi [-]
var
  DateTimeA, DateTimeB: TDateTime;
begin
  DateTimeA := EncodeDateTime(2022, 1, 1, 9, 0, 0, 0);
  DateTimeB := EncodeDateTime(2022, 1, 1, 10, 0, 0, 0);

  // Muestra 59, lo que en principio NO PARECE el resultado esperado
  ShowMessage(IntToStr(MinutesBetween(DateTimeA, DateTimeB)));
end;

P.D. El problema parece estar en Delphi 2007... puesto que en Delphi 10.4 en ambos casos el resultado es el esperado: 60 minutos... lo que me lleva a pensar en algún problema en la unidad "DateUtils" de Delphi 2007... porque además el problema ocurre también, por ejemplo, con la función "SecondsBetween"... y además con varias "horas"... es decir, no sólo de las 9 a las 10, pero, también de las 0 a la 1, por ejemplo.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 22-05-2022 a las 18:50:35.
Responder Con Cita
  #2  
Antiguo 23-05-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Puede que en alguno de los cálculos use un double y haga un "trunc" para quitar decimales y ahí pierda el valor correcto.
Responder Con Cita
  #3  
Antiguo 23-05-2022
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

Cita:
Empezado por Casimiro Notevi Ver Mensaje
Puede que en alguno de los cálculos use un double y haga un "trunc" para quitar decimales y ahí pierda el valor correcto.
Sí que se hace algún "trunc", sí... Lo raro sería porqué el resultado es el esperado con algunas horas y con otras no lo es. Por lo demás, parece que se trata de algo que, al menos en Delphi 10.4, parece "solucionado". Y entrecomillo "solucionado" porque no estoy seguro de que se trate de un error, puesto que desde luego es totalmente consistente: el resultado es siempre el mismo, aunque, no es el esperado. En fin... acaso se pueda lidiar con dicho problema si no queda más remedio. ¡Gracias por tu respuesta Casimiro!
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 23-05-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Y al revés también sucede?
Cita:
ShowMessage(IntToStr(MinutesBetween(DateTimeB, DateTimeA)));
¿Y usar "otra cosa" que no sea IntToStr? ¿o ya viene con el valor incorrecto antes de eso?
Responder Con Cita
  #5  
Antiguo 23-05-2022
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

Cambiando los argumentos el resultado es el mismo, y, por otro lado, usar "otra cosa" que no sea "IntToStr"... no sé muy bien qué posible alternativa habría... acabo de probar con "FloatToStr" y el resultado sigue siendo el mismo también...

P.D. Yo diría que el resultado viene ya directamente así de "MinutesBetween"... y curiosamente también ocurre lo mismo con "SecondsBetween", por ejemplo.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 23-05-2022 a las 11:01:59.
Responder Con Cita
  #6  
Antiguo 23-05-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Copiado de la delphi comunity:
mDateTimeToMillisecons es DateTimeToMillisecons
mMinutesBetween es MinutesBetween

Código Delphi [-]
function mDateTimeToMilliseconds(const ADateTime: TDateTime): Int64;
var
  LTimeStamp: TTimeStamp;
begin
  LTimeStamp := DateTimeToTimeStamp(ADateTime);
  Result := LTimeStamp.Date;
  Result := (Result * MSecsPerDay) + LTimeStamp.Time;
end;

function mMinutesBetween(const ANow, AThen: TDateTime): Int64;
begin
  Result := Abs(mDateTimeToMilliseconds(ANow) - mDateTimeToMilliseconds(AThen))
    div (MSecsPerSec * SecsPerMin);
end;

procedure TForm24.Button1Click(Sender: TObject);
var
  dtA, dtB :TDateTime;
  ano, mes, dia, hor1,hor2, min, seg, mil :int64;
begin
  ano:=2022;
  mes:=1;
  dia:=1;
  hor1:=10;
  hor2:=11;
  min:=0;
  seg:=0;
  mil:=0;

  dtA := EncodeDateTime(ano, mes, dia, hor1, min, seg, mil);
  dtB := EncodeDateTime(ano, mes, dia, hor2, min, seg, mil);
  ShowMessage(IntToStr(mMinutesBetween(dtB, dtA)));

  hor1:=9;
  hor2:=10;

  dtA := EncodeDateTime(ano, mes, dia, hor1, min, seg, mil);
  dtB := EncodeDateTime(ano, mes, dia, hor2, min, seg, mil);;
  ShowMessage(IntToStr(MminutesBetween(dtB, dtA)));
end;
Responder Con Cita
  #7  
Antiguo 23-05-2022
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

Gracias Casimiro. En efecto, es exactamente la misma implementación que en la unidad DateUtils de Delphi 10.4... creo que al final algo así habrá que usarse, puesto que la implementación de la unidad DateUtils en Delphi 2007 parece contener "algo" que causa el "problema".
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
dll delphi funcion capturar resultado JXJ Varios 2 03-03-2011 18:18:00
Funcion MinutesBetween... Jose Roman OOP 6 09-12-2009 23:07:16
delphi.error extraño en la funcion encriptar tebre Varios 2 12-12-2008 20:14:51
Sobre cierto resultado de la función SHGetSpecialFolderPath dec API de Windows 3 01-06-2005 06:59:01
Resultado extraño... vantta C++ Builder 5 01-02-2005 11:45:33


La franja horaria es GMT +2. Ahora son las 12:03:46.


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
Copyright 1996-2007 Club Delphi