FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
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...
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. |
#2
|
||||
|
||||
¿Y con un año más actual funciona bien?, ejemplo: 2012
|
#3
|
||||
|
||||
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. Última edición por geolife fecha: 21-05-2012 a las 23:05:31. |
#4
|
||||
|
||||
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:
Y te debe retornar la fecha base.... No se si haya alguna utilidadad o unidad en Delphi solucione esto.. sorry |
#5
|
||||
|
||||
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:
, atascado con TdateTime... |
#6
|
|||
|
|||
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:
Sólo por curiosidad, he probado en XE2 y en Delphi 2010 y el error está corregido: la sentencia
funciona correctamente. Un saludo, LoPiTaL |
#7
|
||||
|
||||
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:
|
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
EncodeDateTime | mjjj | Varios | 1 | 23-05-2007 23:52:01 |
|