Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Funcion MinutesBetween... (https://www.clubdelphi.com/foros/showthread.php?t=65335)

Jose Roman 06-12-2009 16:17:35

Funcion MinutesBetween...
 
Hola a todos..
Resulta que estoy realizando una comparacion entres dos TDateTime pero tengo una diferencia de un minuto (deberia dar 600 y no 599), habra fallas en esta funcion y que podria hacer para solucionar esto?, probe con HoursBetween y tambien hay una hora de diferencia deberia ser 10 y no 9.
Gracias por su ayuda dejo codigo fuente.

Código Delphi [-]
procedure TForm1.btn1Click(Sender: TObject);
begin
  lbl1.Caption := IntToStr(MinutesBetween(StrToDateTime('06/12/2009 19:00'),StrToDateTime('06/12/2009 09:00')));
end;

Lepe 06-12-2009 21:03:22

esto.... ¿y los segundos en la hora?.... ¿y los milisegundos ? :rolleyes:

Delito tiene decir que esas rutinas fallan :D

yapt 08-12-2009 13:31:02

Hombre, muy normal, muy normal, esto no es: :o

Código Delphi [-]
 Memo1.Lines.add(DateTimeToStr(StrtoTime('12:00'))+' - '+DateTimeToStr(StrtoTime('13:00')));
 Memo1.Lines.add(IntToStr(MinutesBetween(StrToTime('12:00'), StrToTime('13:00'))));
 Memo1.Lines.add(DateTimeToStr(StrtoTime('13:00'))+' - '+DateTimeToStr(StrtoTime('14:00')));
 Memo1.Lines.add(IntToStr(MinutesBetween(StrToTime('13:00'), StrToTime('14:00'))));

Resultado:
Cita:

30/12/1899 12:00:00 - 30/12/1899 13:00:00
59
30/12/1899 13:00:00 - 30/12/1899 14:00:00
60

Lepe 08-12-2009 23:39:22

Sí, tienes razón, para mi no es muy normal andar utilizando la fecha base del calendario para realizar diferencias de horas.:rolleyes:

¿por qué no miras la diferencia entre las 23:00 y las 1:00 con tu código anterior? eso es más ameno ;)

En resumen: Usa formato de fecha y hora siempre. No dejes los milisegundos en olvido si quieres precisión de 1 segundo (ten en cuenta que un milisegundo es el culpable de tener un segundo menos en el resultado, un minuto menos, una hora menos ... :p)

Saludos

yapt 09-12-2009 18:37:52

Pues ya me ilustraras cuando tengas un rato, porque no te entiendo. :-) jejeje....

Como podemos hacer que esas funciones hagan lo que tienen que hacedr de forma correcta (desde un punto de vista "humano") ?

La verdad es que utilizo poco esas funciones. Siempre trabajo en minutos o segundos (para mí, habitualmente, las fechas no son necesarias, por eso guardo solo segundos o minutos -integer- y opero con ellos de forma directa y con mis propias funciones)

Salu2.

Lepe 09-12-2009 20:34:48

ah, perdon.

Lo normal es usar la archifamosa función Now() para tenerlo todo, la fecha, hora y milisegundos, después si quieres cambiar un dato de la fecha, tiras de la unidad dateutils:
- recodeDate
- recodeTime
- encodeDateTime
- decodeDatetime

- dayOf
- monthOf
- yearOf

- incMonth
- incDay
- incHour
- incMinutes
- ...
(revisa la ayuda de DateUtils)

como ves tienes un monton de rutinas para trabajar cómodamente sin tener que codificar con string las fechas y horas.

Al grano en tu ejemplo:
Código Delphi [-]
var vieja, nueva :Tdatetime;
     min : int64; // creo este es el tipo que devuelve minutesbetween
begin
  vieja := now(); 
  vieja := RecodeTime(vieja, 12, 0, 0, 0); // Hora al mediodía; minutos, segundos y milisegundos a cero (porque me da la gana ;) )
  nueva := RecodeTime(vieja, 13, 0, 0, 0 );
  min := MinutesBetween(nueva, vieja);

Si no has tenido problemas hasta ahora, es porque no has calculado diferencias de horas estando de por medio el cambio de fecha, por ejemplo, desde las 23:00 hasta la 1:00 no van 2 horas de diferencia, Delphi te dirá que van 22 horas. Al no considerar la fecha, Delphi usa la misma fecha (30/12/1899 1:00 hasta el 30/12/1899 23:00) calculando la diferencia al revés, desde la 1 de la madrugada hasta las 23:00 horas de ese mismo día

Al principio crees que una rutina como incDay es una tontería, es sólo sumar un día a la fecha anterior pero,¿y si el año es bisiesto? ¿o no lo es?, obviamente todos esos "peros" están ya controlados en esas rutinas.

Saludos

yapt 09-12-2009 23:07:16

Ok... acabaramos. :)

Entonces podemos resumir el asunto en que el problema está en la función
'StrtoTime', pero no en 'MinutesBetween' (que es, también, de dateutils).

Aclarado queda.

Salu2.


La franja horaria es GMT +2. Ahora son las 06:33:22.

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