Код в XSBuiltIns действительно анализирует миллисекундную часть, но эта часть никогда не используется в функциях кодирования.
function TXSBaseTime.GetAsTime: TDateTime;
begin
Result := EncodeTime(Hour, Minute, Second, 0);
end;
и
function TXSBaseCustomDateTime.GetAsDateTime: TDateTime;
var
BiasDT: TDateTime;
BiasTime, BiasLocal: Integer;
BiasHour, BiasMins: Word;
begin
{ NOTE: In XML Years can exceed 9999 - that's not the case for TDateTime.
So here, there would be a problem with the conversion }
Result := EncodeDateTime(Year, Month, Day, Hour, Minute, Second, 0);
и
function TXSBaseCustomDateTime.GetAsUTCDateTime: TDateTime;
var
AdjustDT: TDateTime;
begin
Result := EncodeDateTime(Year, Month, Day, Hour, Minute, Second, 0);
Поскольку последний вызывается из XMLTimeToDateTime, вполне понятно, что миллисекундная часть всегда равна 0.
Весь синтаксический анализ и хранение данных выполняются во внутренних (часть реализации) классах, к которым нельзя получить прямой доступ, кроме как через(сломанные) обертки.Итак, вы должны написать свой собственный анализатор даты / времени.
В дополнение ко всему уродству, обнаруженному в XSBuiltIns, XMLTimeToDateTime фактически анализирует дату дважды.Сначала вызывается TXSDateTime.XSToNative, который анализирует дату / время, выбрасывает результат и сохраняет только исходную строку, а затем TXSCustomDateTime.GetAsUTCDateTime снова анализирует эту строку.Euch!