Ir al contenido


Foto

Unir fecha y horas desde dos datetimepicker


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

#1 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 27 febrero 2015 - 02:29

Hola!!

Dicen que los flojos trabajan dos veces. Y creo que abuso de la flojera -es viernes, hace frió y las promesas del "Copetón" no hacen que sea factible la compra de un pequeño calefactor eléctrico- Bueno ustedes no tienen titulo de psicólogos para "escuchar" mis traumas.

Este codigo:



delphi
  1. procedure TForm1.btn1Click(Sender: TObject);
  2. var
  3.   HFIni, HFFin: TDateTime;
  4.  
  5. begin
  6.   HFIni := dtp1.Date + dtp2.Time;
  7.   HFFin := dtp3.Date + dtp4.Time;
  8.  
  9.   lbl1.Caption := DateTimeToStr(HFIni);
  10.   lbl2.Caption := DateTimeToStr(HFFin);
  11. end;



compila y se ejecuta pero el resultado es incorrecto

En los label aparece:

28/04/2130 02:16:57 a.m.
28/04/2130 03:17:25 a.m.


Como dije el flojo debe trabajar dos veces. Me quise evitar conversiones a string y datetime. Deduzco por obviedad que esa unión de los datetimepicker no es permitida ni valida. ¿Es correcto eso o hay algo que no conosco del uso del datetimepicker?

Saludos y no abusen del alcohol ni dejen que el alcohol abuse de estedes.  (b) (b) (b) (b) (b)
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 27 febrero 2015 - 02:56

A ver compañero, que le parece ésta solución:



delphi
  1.   HFIni := int(DateTimePicker1.DateTime) + frac(DateTimePicker2.DateTime);



Saludos

  • 0

#3 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 27 febrero 2015 - 03:32

OK!!

Funciona correcto. ¿Por que?

Tomado de delphibasics.co.uk

The TDateTime type holds a date and time value.

It is stored as a Double variable, with the date as the integral part, and time as fractional part. The date is stored as the number of days since 30 Dec 1899. It really should be 31 Dec is.

El tipo TDateTime guarda un valor de hora y fecha.

Es almacenado en una variable de tipo Double, con la fecha como la parte entera, y el tiempo o la hora como parte fraccionaria. La fecha es almacenada como el numero de dias transcurridos desde el 30 de Diciembre de 1899. En realidad deberia ser 31 de Diciembre.


Algo que no sabia. Ahi queda por si a alguien mas le sirve en el futuro.
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 27 febrero 2015 - 04:02

OK!!

Funciona correcto. ¿Por que?


Tomado de delphibasics.co.uk

The TDateTime type holds a date and time value.

It is stored as a Double variable, with the date as the integral part, and time as fractional part. The date is stored as the number of days since 30 Dec 1899. It really should be 31 Dec is.

El tipo TDateTime guarda un valor de hora y fecha.

Es almacenado en una variable de tipo Double, con la fecha como la parte entera, y el tiempo o la hora como parte fraccionaria. La fecha es almacenada como el numero de dias transcurridos desde el 30 de Diciembre de 1899. En realidad deberia ser 31 de Diciembre.


Algo que no sabia. Ahi queda por si a alguien mas le sirve en el futuro.


Efectivamente, si miras en debug el valor de un campo TDateTime siempre lo vas a ver como un valor decimal por ejemplo ( 42062.618865 ).

Que bueno que sirvió. (y)

Saludos
  • 0

#5 gusspagano

gusspagano

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 25 abril 2017 - 12:24

Genial...!!!

 

 

Muchas gracias..!


  • 0

#6 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 25 abril 2017 - 02:46

Hola, si bien lo que plantea Ego es correcto, yo me he creado un ayudante para TDateTime con el cual me desentiendo de detalles de implementacion (de que los TDateTime en realidad son numeros Double y que una parte representa esto y la otra parte lo otro)

 

Para eso prefiero usar las funciones de mas alto nivel de System.DateUtils (y tambien hay algunas mas en System.SysUtils)

 

Y ahora que veo mi propio codigo creo que lo adecuado tambien seria crear un helper para TTime


delphi
  1. uses
  2. System.SysUtils,
  3. System.DateUtils,
  4. DateTimeHelper;
  5.  
  6. procedure Main;
  7. var
  8. Fecha, FechaFin: TDateTime;
  9. Hora: TTime;
  10. begin
  11. // cuidado con la config. regional, aunque el ayudante TDateTimeHelper tiene una sobrecarga
  12. // para el metodo Parse en la que se puede pasar un TFormatSettings
  13. Fecha := TDateTime.Parse('25/4/2017 3:00:00');
  14. Hora := System.SysUtils.StrToTime('3:12:34'); // cuidado con la config. regional
  15. FechaFin := Fecha.AddTime(Hora);
  16. Writeln('Fecha: ' + Fecha.ToString); // Fecha: 25/4/2017 3:00:00 a. m.
  17. Writeln('Hora: ' + System.SysUtils.TimeToStr(Hora)); // Hora: 3:12:34 a. m.
  18. Writeln('FechaFin: ' + FechaFin.ToString); // FechaFin: 25/4/2017 6:12:34 a. m.
  19. end;

En donde el codigo para implementar el mensaje AddTime es tambien bastante expresivo y facil de entender:


delphi
  1. function TDateTimeHelper.AddTime(const Value: TTime): TDateTime;
  2. var
  3. Time: TDateTime absolute Value; // esto es un "hack" porque no tengo un ayudante para TTime
  4. begin
  5. Result := Self
  6. .AddHours(Time.Hours)
  7. .AddMinutes(Time.Minutes)
  8. .AddSeconds(Time.Seconds)
  9. .AddMilliseconds(Time.Milliseconds);
  10. end;

Y DateTimeHelper en realidad consiste en dos unidades:

 

DateTimeHelper: En donde esta el ayudante propiamente dicho

DateTimeHelper.Exceptions: Para manejo de excepciones


  • 1




IP.Board spam blocked by CleanTalk.