2012-04-05 13 views
6

Mam wartość TDateTime (otrzymaną w wyniku od EndOfTheMonth(date)) do typu wariantu. Wynik jest błędnie zaokrąglony. Rzućmy okiem na przykład:Zła konwersja z EndOfTheMonth (data) na wartość wariantu

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? 

Czy zaprojektowano zachowanie? Jak obejść ten problem?

Odpowiedz

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

Aktualizacja: Przypuszczam, że problem jest, że ostatni milisekundę miesiąca jest bardzo blisko 0:00:00 następnego dnia, czyli wartość TDateTime (który jest w zasadzie double) jest bardzo zbliżone do liczby całkowitej (np. 41029.9999999884 jest bardzo zbliżone do 41029), więc funkcja VarToStr zakłada, że ​​dziesiętne są liczbowe.

+2

'DateTimeToStr (V)' pokazuje również prawidłowy wynik. Najwyraźniej problem dotyczy funkcji 'VarToStr()'. –

+0

http://www.devexpress.com/Support/Center/p/B223005.aspx, więc się mylą? – JustMe

+2

@AndriyM: To prawda, ale nigdy nie jest (?) Źle, aby było zbyt jednoznaczne! :) –