2012-04-05 8 views
6

Tengo un valor TDateTime (que obtengo como resultado de EndOfTheMonth(date)) a un tipo de variante. El resultado está incorrectamente redondeado. Echemos un vistazo al ejemplo:Mala conversión de EndOfTheMonth (date) a Variant value

data := EndOfTheMonth(date); 
    V := data; 
    ShowMessage(DateTimeToStr(data) + ' vs ' + VarToStr(V)); 
// output is 
// data = 2012-01-31 23:59:59 
// v = 2012-02-01   // why next day? 

¿Está diseñado el comportamiento? ¿Cómo evitar esto?

Respuesta

6
ShowMessage(DateTimeToStr(data) + ' vs ' + DateTimeToStr(VarToDateTime(V))); 

Actualización: yo supongo que el problema es que el último milisegundo del mes está muy cerca de 0:00:00 al día siguiente, es decir, el valor TDateTime (que es básicamente una double) está muy cerca de un número entero (por ejemplo, 41029.9999999884 está muy cerca de 41029) y, por lo tanto, la función VarToStr asume que los decimales son fuzz numéricos.

+2

'DateTimeToStr (V)' muestra el resultado correcto también. Aparentemente, el problema es con la función 'VarToStr()'. –

+0

http://www.devexpress.com/Support/Center/p/B223005.aspx así que están equivocados? – JustMe

+2

@AndriyM: Es cierto, pero nunca es (?) Incorrecto ser demasiado explícito. :) –

Cuestiones relacionadas