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 21-05-2012
Avatar de geolife
[geolife] geolife is offline
Miembro Premium
 
Registrado: nov 2006
Ubicación: Barcelona
Posts: 88
Poder: 18
geolife Va por buen camino
Problema con EncodeDateTime < 1900

Hola amig@s,

Estoy haciendo una aplicación con Delphi 7 que trata con cálculos de fechas y me encuentro que al transformar valores inferiores al año 1900, los resultados con EncodeDateTime son incoherentes...

Código Delphi [-]
Var
 A: TdateTime;
begin

 // Fecha: 4 febrero 1755, 1 horas 22 minutos, 22 segundos - 
 A := EncodeDateTime (1755,2,4,1,22,22,1); // Uses DateUtils
 ShowMessage (DateTimeToStr(A));
 // Da como resultado 5 febrero de 1755 , 22 horas 37 segundos, es decir otro resultado?
 // Obviamente uno esperaría 4 febrero 1755, 1 horas 22 minutos, 22 segundos
 end;

He probado la misma rutina en Lazarus y funciona bien, no se si trata de alguna caracteristica especial en Delphi o que

¿Alguien se ha encontrado con lo mismo?

Gracias!

Última edición por geolife fecha: 21-05-2012 a las 20:45:47.
Responder Con Cita
  #2  
Antiguo 21-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Y con un año más actual funciona bien?, ejemplo: 2012
Responder Con Cita
  #3  
Antiguo 21-05-2012
Avatar de geolife
[geolife] geolife is offline
Miembro Premium
 
Registrado: nov 2006
Ubicación: Barcelona
Posts: 88
Poder: 18
geolife Va por buen camino
Hola Casimiro!

Si!, en general a partir de 1900 hacia adelante funciona perfectamente, pero en fechas inferiores el resultado es completamente erróneo, da una fecha distinta a la introducida La verdad es que no tengo más remedio que usar esta función, para codificar los formatos de fecha y tiempo de una forma homogénea en cualquier región, pero nada!!

No he tenido oportunidad de probar en otras versiones de Delphi más actuales a la 7, solo probé en Lazarus el ejemplo adjunto y funciona bien.

Nota: Según la ayuda de Delphi, el año admite valores desde 1 a 9999, con lo que debería funcionar..., pero algo falla!

datetime routines

Delphi syntax:

function EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Word):TDateTime;

Description

EncodeDateTime returns a TDateTime from the values specified as the AYear, AMonth, ADay, AHour, AMinute, ASecond, and AMilliSecond parameters.

The year must be between 1 and 9999.

Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿Y con un año más actual funciona bien?, ejemplo: 2012

Última edición por geolife fecha: 21-05-2012 a las 23:05:31.
Responder Con Cita
  #4  
Antiguo 22-05-2012
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
hola geolife

El problema está en que el TdateTime es en realidad un valor numérico de punto flotante, un double o un Real... y el CERO representa el año 1900, Esto no es propio de Delphi, algunos motores de base de datos de hecho tienen como bae el 1899... No se por que ni cuando se pusieron de acuerdo en eso...

puedes hacer la prueba con algo como:

Código Delphi [-]
fecha: TDateTime
fecha:= 0;
showMessage(DateToStr(Fecha));

Y te debe retornar la fecha base....

No se si haya alguna utilidadad o unidad en Delphi solucione esto.. sorry
Responder Con Cita
  #5  
Antiguo 22-05-2012
Avatar de geolife
[geolife] geolife is offline
Miembro Premium
 
Registrado: nov 2006
Ubicación: Barcelona
Posts: 88
Poder: 18
geolife Va por buen camino
Gracias por la información Gatosoft, TDateTime funciona como tu comentas, pero no se como pasar los datos TTime en coma flotante de una forma predecible. De hecho la función EncodeDate ya funciona bien con fechas inferiores a 1900, el problema es cuando incluimos el tiempo de horas, minutos y segundos con EncodeDateTime.

Si fuera solo cuestión de guardar la información, podríamos pasar los valores de forma separada utilizando EncodeDate y EncodeTime, el problema es que el software se encarga de realizar cálculos de tiempo utilizando años,meses,dias, horas, minutos y segundos.

En resumen tenemos:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
Var
 A,B: TDateTime;
begin

 // Fecha: 4 febrero 1755, 1 horas 22 minutos, 22 segundos -
 A := EncodeDateTime (1755,2,4,1,22,22,1); // Uses DateUtils
 ShowMessage (DateTimeToStr(A));
 // ERROR
 // Da como resultado 5 febrero de 1755 , 22 horas 37 segundos, es decir otro resultado?
 // Obviamente uno esperaría 4 febrero 1755, 1 horas 22 minutos, 22 segundos

  A := EncodeDate (1755,2,4); B:= EncodeTime (1,12,22,1); // Uses DateUtils
  ShowMessage (DateToStr(A)+ ' '+ (TimeToStr(B)));
  // OK la visualización, pero tenemos la información en 2 variables.

  // Intentamos poner en A el valor TDateTime por seperado
  A := EncodeDate (1755,2,4); A := EncodeTime (1,12,22,1);
  ShowMessage (DateTimeToStr(A));
  // ERROR OTRA VEZ
  // ¿¿ ????
 end;
end.

, atascado con TdateTime...
Responder Con Cita
  #6  
Antiguo 22-05-2012
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Tal vez ya te has dado cuenta, o ha sido al ponerlo en el navegador, pero la última parte de tu código está mal.

Debería ser:

Código Delphi [-]
  // Intentamos poner en A el valor TDateTime por seperado
  A := EncodeDate (1755,2,4) + EncodeTime (1,12,22,1);  //Debes sumar fecha y hora, si no, 
                                                                              //sólo te quedará en A la hora, a fecha base (1900)
  ShowMessage (DateTimeToStr(A));                             //Debería ir bien ahora
  // ERROR OTRA VEZ
  // ¿¿ ????

Sólo por curiosidad, he probado en XE2 y en Delphi 2010 y el error está corregido: la sentencia

Código Delphi [-]
A := EncodeDateTime (1755,2,4,1,22,22,1); // Uses DateUtils

funciona correctamente.

Un saludo,
LoPiTaL
Responder Con Cita
  #7  
Antiguo 22-05-2012
Avatar de geolife
[geolife] geolife is offline
Miembro Premium
 
Registrado: nov 2006
Ubicación: Barcelona
Posts: 88
Poder: 18
geolife Va por buen camino
Hola LoPiTaL!,

Llevas toda la razón, la sentencia correcta para ese tipo de asignación debe ser una suma, el codigo era parte de varias pruebas y me habia quedado así...

Te agradezco tus pruebas, parece ser entonces que en versiones sucesivas de Delphi esto esta corregido, y es una buena noticia.
Me parece que me voy abocado a una actualización de Delphi.

Gracias otra vez!



Cita:
Empezado por LoPiTaL Ver Mensaje
Tal vez ya te has dado cuenta, o ha sido al ponerlo en el navegador, pero la última parte de tu código está mal.

Debería ser:

Código Delphi [-]
  // Intentamos poner en A el valor TDateTime por seperado
  A := EncodeDate (1755,2,4) + EncodeTime (1,12,22,1);  //Debes sumar fecha y hora, si no, 
                                                                              //sólo te quedará en A la hora, a fecha base (1900)
  ShowMessage (DateTimeToStr(A));                             //Debería ir bien ahora
  // ERROR OTRA VEZ
  // ¿¿ ????

Sólo por curiosidad, he probado en XE2 y en Delphi 2010 y el error está corregido: la sentencia

Código Delphi [-]
A := EncodeDateTime (1755,2,4,1,22,22,1); // Uses DateUtils

funciona correctamente.

Un saludo,
LoPiTaL
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
EncodeDateTime mjjj Varios 1 23-05-2007 23:52:01


La franja horaria es GMT +2. Ahora son las 01:45:24.


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