Ir al contenido


Foto

Hora en entero a hora en decimal.


  • Por favor identifícate para responder
7 respuestas en este tema

#1 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 14 enero 2013 - 02:01

Jóvenes Delphineros, buena tarde...

Les platico mi problema. Resulta que en los desarrollos de la empresa manejamos por separado la fecha como un número Double y la hora como un entero resultado del cálculo de las horas y minutos transcurridos desde la medianoche (00:00) del día que se trate.

Como sabemos, el tipo TDateTime es un número doble conformado por la fecha (la parte entera del número) y la hora en precisión de hasta milisegundos (la parte en decimales del número); pero ahora se me viene el problema que debo obtener DE REGRESO el valor TDateTime a partir de sumar la fecha (un número entero, en éste caso) a OTRO NÚMERO ENTERO que significa la hora (un número entero con precisión de hasta minutos) en el siguiente formato:



delphi
  1. iLaHora := 675;



Siendo 675 el equivalente a las 11:15 am. Mi problema principal ahora se remite a obtener el número decimal que equivalga a las 11:15 para sumarlo al número entero que me significa la fecha (quedando como 41860.58101212343564 o algo así) y poder hacer cálculos a partir de éste número.

Intenté obtener la hora con ésta operación:



delphi
  1. dLaHora := (iLaHora /60)*0.01);



y



delphi
  1. dLaHora := (iLaHora /60);



... pero en ambos casos, el número NO REPRESENTA las 11:15 am.

¿Podría alguien orientarme en cómo resolver ésto? Es decir, obtener la hora en un número decimal a partir de un número entero.

Agradeciendo de antemano su atención, y en espera de sus ideas, por locas que puedan parecer.
  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 14 enero 2013 - 02:16



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   H, M, S, MS: Word;
  4.   dt: TDateTime;
  5.   iHora: Integer;
  6. begin
  7.   iHora := strtoint(Edit1.Text);
  8.   H := iHora div 60;
  9.   M := iHora mod 60;
  10.   S := 00;
  11.   MS := 00;
  12.   dt := EncodeTime(H, M, S, MS);
  13.   showmessage(timetostr(dt));
  14. end;


  • 0

#3 luisgutierrezb

luisgutierrezb

    Advanced Member

  • Miembros
  • PipPipPip
  • 92 mensajes
  • LocationMéxico

Escrito 14 enero 2013 - 02:19

mmm a simple vista, porque no pruebas con esto:

[Delphi]
dLaHora := ((iLaHora /60) /24);
[/Delphi]

Saludos!
  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 14 enero 2013 - 02:38

Un ejemplo más claro de mi primer post.



delphi
  1. function EnetroADateTime(const Ihora: Integer): TDateTime;
  2. var
  3.   H, M, S, MS: Word;
  4. begin
  5.   H := Ihora div 60;
  6.   M := Ihora mod 60;
  7.   S := 00;
  8.   MS := 00;
  9.   Result := EncodeTime(H, M, S, MS);
  10. end;
  11.  
  12. procedure TForm1.Button1Click(Sender: TObject);
  13. begin
  14.   showmessage(timetostr(EnetroADateTime(strtoint(Edit1.Text))));
  15. end;



Saludos
  • 0

#5 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 14 enero 2013 - 02:45

...Saludos


Gracias, gracias..., pero el detalle es el que más me ahorca..., ¿qué le voy a sumar al entero que representa la fecha? Lo que me muestras aquí despliega la fecha "formateada", no podría sumar ésto a un entero para que termine mostrándome fecha+hora en un FormatDateTime().
  • 0

#6 luisgutierrezb

luisgutierrezb

    Advanced Member

  • Miembros
  • PipPipPip
  • 92 mensajes
  • LocationMéxico

Escrito 14 enero 2013 - 02:48

En el ejemplo que puse, te regresa la parte decimal del TDateTime que maneja las horas, si le sumas una parte entera "compatible" con TDateTime, solo lo sumas y tendras un TDateTime valido...
  • 0

#7 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 14 enero 2013 - 02:52

En el ejemplo que puse, te regresa la parte decimal del TDateTime que maneja las horas, si le sumas una parte entera "compatible" con TDateTime, solo lo sumas y tendras un TDateTime valido...


Precisamente era lo que necesitaba. Caso resuelto. Gracias, Luis.
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 14 enero 2013 - 10:03

¡Yo diría que a tu jefecito le hace falta una tontolotomia urgente!  *-)  :D

Si ya existe el TDateTime y funciona bien (aunque para algunas cositas puede ser un poco quisqui), ¡que ganas de darle más vueltas que la calesita!. Y si se quiere poner más jodón aún con lo de precisiones con fechas/horas allí tiene TTimeStamp; asi que dile que no haga esos inventos que a la larga es para más problemas... sobre todo si no se controla adecuadamente el manejo de la aritmética de punto flotante. Sino fíjense como en algunas funciones relacionadas con las fechas/horas hace algunos controles.

Por ejemplo éstas, que se valen del error absoluto como criterio de evaluación:



delphi
  1. function CompareTime(const A, B: TDateTime): TValueRelationship;
  2. begin
  3.   if Abs(Frac(A) - Frac(B)) < OneMillisecond then
  4.     Result := EqualsValue
  5.   else if A < B then
  6.     Result := LessThanValue
  7.   else
  8.     Result := GreaterThanValue;
  9. end;
  10.  
  11. function SameTime(const A, B: TDateTime): Boolean;
  12. begin
  13.   Result := Abs(Frac(A) - Frac(B)) < OneMillisecond;
  14. end;



Yo me aseguraría y trataría de atenerme a las funciones de la unidad DateUtils que están pensadas justo para evitar cualquier problema.

Si los números de coma flotante son un dolor de cabeza... el TDateTime también puede serlo. Ojo al piojo también.  ;)

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.